我很难弄清楚如何使用某些模式匹配来确定要使用哪些列,从而在data.table
中执行多项操作。例如:
library(data.table)
library(dplyr)
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:data.table':
#>
#> between, first, last
#> The following objects are masked from 'package:stats':
#>
#> filter, lag
#> The following objects are masked from 'package:base':
#>
#> intersect, setdiff, setequal, union
library(tidyr)
iris <- copy(iris)
iris_dplyr_above_6 <- iris %>%
select(contains("Length"), Species) %>%
gather(col, val, -Species) %>%
filter(val > 6)
unique(iris_dplyr_above_6$Species)
#> [1] versicolor virginica
#> Levels: setosa versicolor virginica
setDT(iris)
iris_dt_above_6 <- iris[Sepal.Length > 6 | Petal.Length > 6,]
unique(iris_dt_above_6$Species)
#> [1] versicolor virginica
#> Levels: setosa versicolor virginica
由reprex package(v0.3.0)于2019-07-19创建
在此示例中,我可以基于“长度”字符串选择带有dplyr
的列。在data.table
中,我必须手动输入每一列。显然,此示例很简单,因为键入两个列名几乎没有麻烦。但是,在您有许多列的情况下,采用某种编程方式选择列很有用。我假设data.table
可以做到这一点,但我还没有找到。也许我误解了这个问题,而实际上这是一个基本的R解决方案。
有什么建议吗?
答案 0 :(得分:3)
你可以
melt(iris, id="Species", measure=patterns("Length"))[value > 6, unique(Species)]
它如何工作。我对tidyr不太熟悉,但是... melt
对应于gather
,而measure.vars
arg允许选择列,其中可能有多个组,例如patterns("Length", "Width")
。
Context。 melt
语法是从reshape2包继承的,该包最初是由dplyr,tidyr等人开发的。如果您有兴趣继续使用gather
is soon to be replaced和pivot_longer
。听起来最终它还将具有patterns()
功能。