【问题标题】:use dplyr to select columns使用 dplyr 选择列
【发布时间】:2015-03-24 09:42:08
【问题描述】:

我正在尝试使用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

我可以使用任何提示来仅在新数据框中获取过滤器向量的匹配字符吗?

【问题讨论】:

  • 您好,不清楚您想要做什么或您期望的结果,以及one_of 的来源?也许你想做的是df1[, names(df1) %in% vec_fil]
  • 嗨,是的.. 你写的正是我所期望的.. dplyr 可以做同样的事情吗?
  • 您可以像select(df1, matches(paste(vec_fil, collapse = "|"))) 那样做一些荒谬的事情,但我只是不明白为什么在这种情况下不使用base R。
  • 是的,select(df1, which(names(df1) %in% vec_fil)) 应该可以完成这项工作
  • 太棒了!感谢大家! @Mamoun,如果您发表评论作为答案,我会接受。

标签: r subset dplyr


【解决方案1】:

你可以在base R中试试这段代码

df1[, names(df1) %in% vec_fil]

如果你想使用包dplyr

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

【讨论】:

    【解决方案2】:

    我迟到了。但是,没有人解释错误的原因是什么。所以,我愿意。

    您错误地使用了dplyr 包中的one_of()。根据包文档,它选择 [all] 向量中的变量。

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

    它不允许您从one_of() 向量中选择变量子集,尽管函数的名称暗示了这一点。

    在您的情况下,vec_fil 向量具有一些数据框中不存在的特征名称。因此,它会引发错误。当您有很长的功能名称列表并且您不想手动键入它们时,您应该只使用one_of()。因此,您可以直接从列表中读取它们。

    希望对你以后的工作有所帮助。

    【讨论】:

      【解决方案3】:

      只需使用 intersect 删除数据框中未包含的变量名称:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-23
        • 1970-01-01
        • 2015-01-08
        • 1970-01-01
        • 2018-07-03
        • 2017-11-28
        相关资源
        最近更新 更多