使用 dplyr 到 select 列
use dplyr to select columns
我正在尝试使用 dplyr
的 select
函数来提取另一个数据帧的列。
这里是数据框:
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
我可以使用任何提示来仅获取新数据框中过滤向量的匹配字符吗?
只需使用 intersect
删除未包含在数据框中的变量名称:
select(df1, one_of(intersect(vec_fil, names(df1))))
你可以在 base R 中尝试这段代码
df1[, names(df1) %in% vec_fil]
如果您想使用包 dplyr
select(df1, which(names(df1) %in% vec_fil))
我迟到了。但是,没有人解释错误的原因是什么。所以,我愿意。
您错误地使用了 dplyr
包中的 one_of()
。根据包文档,它 selects [所有] 向量中的变量。
one_of("x", "y", "z"): selects variables provided in a character vector.
它不允许您 select 来自 one_of()
向量的变量子集,尽管函数名称暗示了这一点。
在您的例子中,vec_fil
向量有一些数据框中不存在的特征名称。因此,它会抛出错误。当您有一长串功能名称并且您不想手动输入它们时,您应该只使用 one_of()
。因此,您可以直接从列表中读取它们。
希望对您以后的工作有所帮助。
我正在尝试使用 dplyr
的 select
函数来提取另一个数据帧的列。
这里是数据框:
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
我可以使用任何提示来仅获取新数据框中过滤向量的匹配字符吗?
只需使用 intersect
删除未包含在数据框中的变量名称:
select(df1, one_of(intersect(vec_fil, names(df1))))
你可以在 base R 中尝试这段代码
df1[, names(df1) %in% vec_fil]
如果您想使用包 dplyr
select(df1, which(names(df1) %in% vec_fil))
我迟到了。但是,没有人解释错误的原因是什么。所以,我愿意。
您错误地使用了 dplyr
包中的 one_of()
。根据包文档,它 selects [所有] 向量中的变量。
one_of("x", "y", "z"): selects variables provided in a character vector.
它不允许您 select 来自 one_of()
向量的变量子集,尽管函数名称暗示了这一点。
在您的例子中,vec_fil
向量有一些数据框中不存在的特征名称。因此,它会抛出错误。当您有一长串功能名称并且您不想手动输入它们时,您应该只使用 one_of()
。因此,您可以直接从列表中读取它们。
希望对您以后的工作有所帮助。