使用dplyr选择列

5

我想使用dplyrselect函数来提取另一个数据框中的列。

这是数据框:

dput(df1)
structure(list(Al = c(30245, 38060, 36280, 24355, 27776, 35190, 
38733.8, 36400, 29624, 33699.75), As = c(9, 8.75, 13.5, 7.75, 
7.6, 8.33, 8, 8.75, 7.4, 8.25), Cd = c(0.15, 0.13, 0.15, 0.1, 
0.16, 0.13, 0.24, 0.15, 0.22, 0.13), Cr = c(108.5, 111.75, 104.5, 
81.25, 93.2, 109.75, 105, 104, 87.8, 99.75), Hg = c(0.25, 0.35, 
0.48, 1.03, 1.12, 0.2, 1.14, 0.4, 2, 0.48)), row.names = c(NA, 
10L), class = "data.frame", .Names = c("Al", "As", "Cd", "Cr", 
"Hg"))

这里是我想要用作过滤器的字符向量:

dput(vec_fil)
c("Elemento", "As", "Cd_totale", "Cr_totale", "Cu_totale", "Hg", 
"Ni_totale", "Pb_totale", "Zn_totale", "Composti_organostannici", 
"PCB_totali", "Sommatoria_DDD", "Sommatoria_DDE", "Sommatoria_DDT", 
"Clordano", "Dieldrin", "Endrin", "Esaclorocicloesano", "Eptacloro_epossido", 
"Sommatoria_IPA", "Acenaftene", "Antracene", "Benzo.a.antracene", 
"Benzo.a.pirene", "Crisene", "Dibenzo.ac._.ah.antracene", "Fenantrene", 
"Fluorantene", "Fluorene", "Naftalene", "Pirene")

正如你所看到的,vec_fil有许多字符与df1的列不匹配,因此我会得到以下错误:

require("dplyr")
df2 <- select(df1, one_of(vec_fil))
Error: Each argument must yield either positive or negative integers

有什么提示可以帮助我只获取新数据框中过滤向量的匹配字符?

1
你好,不太清楚你想做什么或者期望的结果是什么,one_of 是从哪里来的?也许你想要做的是 df1[, names(df1) %in% vec_fil] - Mamoun Benghezal
嗨,是的...你写的正是我期望的...使用dplyr也能做到同样的事情吗? - matteo
2
你可以像这样做一些荒谬的事情:select(df1, matches(paste(vec_fil, collapse = "|"))),但我只是不明白为什么在这种情况下不使用基本的R。 - David Arenburg
2
是的,select(df1, which(names(df1) %in% vec_fil)) 可以完成这个任务。 - Mamoun Benghezal
1
太好了!感谢大家!@Mamoun,如果您将您的评论发布为答案,我会接受它。 - matteo
3个回答

7
您可以在基础R中尝试此代码。
df1[, names(df1) %in% vec_fil]

如果你想使用 dplyr

select(df1, which(names(df1) %in% vec_fil))

5
我晚了参加这个聚会。但是,没有人解释错误的原因。所以我来解释一下。
您错误地使用了dplyr包中的one_of()函数。根据包的文档,它选择在向量中的[所有]变量。

one_of("x", "y", "z"):选择提供在字符向量中的变量。

它不允许您从one_of()向量中选择变量的子集,尽管该函数的名称暗示了这一点。
在您的情况下,vec_fil向量有一些特征名称不存在于数据框中。因此,它会出现错误。只有在您有一个长列表的特征名称并且不想手动输入它们时,才应该使用one_of()。因此,您可以直接从列表中读取它们。
希望这对您未来的工作有所帮助。

3

使用intersect仅删除未包含在您的数据框中的变量名称:

select(df1, one_of(intersect(vec_fil, names(df1))))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接