我有两个数据框 第一个是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行和单列。我的目标是使用df2数据框中列中的值来获取df1的子集。
head(df2)
ID
cg1
cg2
cg3
cg4
cg5
df2的值是df1中我感兴趣的列名,因此我在R中尝试了以下单行。
> UP=(df1 %>% as.data.frame)[,df2$ID]
向上数据框从我的查询df2
返回不匹配的列它导致数据帧UP有84列和100行,但上面命令行返回的列都没有与输入查询数据帧df2匹配。
如果有人建议我替代解决方案,那将会很棒
答案 0 :(得分:2)
假设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()]
答案 1 :(得分:1)
在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的帧内进行评估;柱 名称可以用作变量。
当= = FALSE时,j是列名的字符向量,数字 列位置向量选择或形式startcol:endcol, 并且返回的值始终是data.table。通常为= 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]