【发布时间】:2018-07-17 16:18:39
【问题描述】:
我想使用从数据框中选择行的子集
存储在列表中的值。对数据框进行子集化是一个常见主题(例如
this 或 this),
但在所有这些问题中,值在运行之前是已知的。我想
使用闪亮的应用程序中生成的命名列表来挑选行和
将它们显示在数据表对象中。我会使用dplyr::filter() 但我
认为同样的想法应该适用于subset() 或[]。
library(dplyr)
data("mtcars")
# get all 6 cylinder cars with 3 gears
filter(mtcars, cyl == 6 & gear == 3)
#> mpg cyl disp hp drat wt qsec vs am gear carb
#> 1 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
#> 2 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
到目前为止一切都很好,但我在命名列表中有这些值。
pickthese <- list(cyl = 6, gear = 3)
我尝试了paste() 与parse() 和eval() 的变体,而这个
有效,但看起来很笨拙。
eval(
parse(
text = paste("filter(mtcars, ",
paste(paste0(names(pickthese)[1]," == ", pickthese[[1]]),
paste0(names(pickthese)[2]," == ", pickthese[[2]]), sep = ","),
")")))
#> mpg cyl disp hp drat wt qsec vs am gear carb
#> 1 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
#> 2 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
我可以将内部 paste0() 变成一个函数并使用 *apply() 或
purrr::map 简化一些。有更好的解决方案吗?
编辑:
r2evans 提出了一个很好的观点,即如果用户搞砸了会发生什么。我可以想到两种可能的方法——首先,用户可以选择数据框中没有的值,其次,用户可以选择数据框中没有的变量名。第二种情况不应该发生,因为应用程序中的变量名是我设置的,但我也不能幸免于搞砸!我认为解决方案应该返回具有相同列的零行数据框(在第一种情况下),或者导致错误。
# test case
lst <- list(cyl = 6.2, gear = 3, foo = "bar")
创建于 2018-07-17 由reprex package (v0.2.0)。
【问题讨论】: