У меня есть два кадра данных. Первый - df1 имеет 485513 столбцов и 100 строк,
head(df1)
sample cg1 cg2 cg3 cg4 cg5 cg6 cg7 cg8 cg9 cg10 cg11
AAD_1 33435 33436 33437 33438 33439 33440 33441 33442 33443 33444 33445
AAD_2 0.33 1.33 2.33 3.33 4.33 5.33 6.33 7.33 8.33 9.33 10.33
AAD_3 0.56 1.56 2.56 3.56 4.56 5.56 6.56 7.56 8.56 9.56 10.56
AAD_4 45.9 46.9 47.9 48.9 49.9 50.9 51.9 52.9 53.9 54.9 55.9
AAD_5 46.9 47.9 48.9 49.9 50.9 51.9 52.9 53.9 54.9 55.9 56.9
AAD_6 47.9 48.9 49.9 50.9 51.9 52.9 53.9 54.9 55.9 56.9 57.9
AAD_7 48.9 49.9 50.9 51.9 52.9 53.9 54.9 55.9 56.9 57.9 58.9
AAD_8 49.9 50.9 51.9 52.9 53.9 54.9 55.9 56.9 57.9 58.9 59.9
AAD_9 50.9 51.9 52.9 53.9 54.9 55.9 56.9 57.9 58.9 59.9 60.9
AAD_10 51.9 52.9 53.9 54.9 55.9 56.9 57.9 58.9 59.9 60.9 61.9
а второй имеет df2 84 строки и один столбец. Я пытаюсь получить подмножество df1, используя значения в столбце из фрейма данных df2.
head(df2)
ID
cg1
cg2
cg3
cg4
cg5
Значения df2 - это имена столбцов моего интереса от df1, поэтому я попробовал следующий однострочный в R.
> UP=(df1 %>% as.data.frame)[,df2$ID]
Кадр данных Up возвращает меня с несогласованными столбцами из моего запроса df2
И это привело к созданию фрейма данных UP с 84 столбцами и 100 строками, но ни один из столбцов приведенной выше командной строки не совпадает с фреймом данных ввода данных df2.
Было бы здорово, если бы кто-то предложил мне альтернативное решение
В R
мы можем просто сделать
df[as.character(df2$ID)]
предполагая, что столбец "ID" является factor
. В случае, если это класс character
, это проще
df[df2$ID]
Но если в "ID" есть элементы, которые не находятся в именах столбцов "df", лучше использовать intersect
df[intersect(colnames(df), df2$ID)]
Если "df" является data.table
, обычным способом подмножества столбцов будет включение with =FALSE
. Он упоминается в ?data.table
с
По умолчанию с = TRUE и j оценивается внутри фрейма x; имена столбцов могут использоваться как переменные.
Когда with = FALSE j является символьным вектором имен столбцов, числовым вектором позиций столбцов для выбора или формы startcol: endcol и возвращаемым значением всегда является таблица данных. with = FALSE часто полезно в data.table для динамического выбора столбцов. Обратите внимание, что x [, cols, with = FALSE] эквивалентно x [,.SD,.SDcols = cols].
Поэтому приведенные выше команды будут
df[, as.character(df2$ID), with = FALSE]
или
df[, df2$ID, with = FALSE] #if 'ID' is already character class.
Или
df[, intersect(colnames(df), df2$ID), with = FALSE]
data.frame
и из вашего ввода я не смог собрать, что это был data.table или data.frame. Если это data.table, df[, as.character(df2$ID), with = FALSE]
Предполагая, что df2
является серией:
>>> df[df2.tolist()]
cg1 cg2 cg3 cg4 cg5
0 33435.00 33436.00 33437.00 33438.00 33439.00
1 0.33 1.33 2.33 3.33 4.33
2 0.56 1.56 2.56 3.56 4.56
3 45.90 46.90 47.90 48.90 49.90
4 46.90 47.90 48.90 49.90 50.90
5 47.90 48.90 49.90 50.90 51.90
6 48.90 49.90 50.90 51.90 52.90
7 49.90 50.90 51.90 52.90 53.90
8 50.90 51.90 52.90 53.90 54.90
9 51.90 52.90 53.90 54.90 55.90
Если это кадр данных, то это должно работать:
df[df2.ID.tolist()]
df2.squeeze().tolist()
?