使用data.table在多列上执行操作

时间:2019-07-19 19:04:30

标签: r dplyr data.table

我很难弄清楚如何使用某些模式匹配来确定要使用哪些列,从而在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解决方案。

有什么建议吗?

1 个答案:

答案 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 replacedpivot_longer。听起来最终它还将具有patterns()功能。