在data.table [R]中将条件应用于每个列的条件

时间:2020-01-14 23:03:23

标签: r data.table

我想将几个函数应用于一列,但是我想对执行此操作应用一些逻辑,在这种情况下,当另一列具有某些NA时。为了说明这一点,我将向TheService数据集添加一些NA,并将其转换为data.table:

@Inject

如果我想将iris应用于多个列,我会这样:

library(data.table)

irisdt <- iris
## Prep some example data
irisdt[irisdt$Sepal.Length < 5,]$Sepal.Length <- NA
irisdt[irisdt$Sepal.Width < 3,]$Sepal.Width <- NA

## Turn this into a data.table
irisdt <- as.data.table(iris)

但是,在这种情况下,我想取出max中不是NA的任何行,然后返回max和min以及NA的I子集的名称。下面是实现此问题的丑陋方式,但希望能说明我的追求:

## Apply a function to individual columns
irisdt[, lapply(.SD, max), .SDcols = c("Petal.Length", "Petal.Width")]
#>    Petal.Length Petal.Width
#> 1:          6.9         2.5

reprex package(v0.3.0)于2020-01-14创建

关于如何实现此目标的任何想法?

1 个答案:

答案 0 :(得分:7)

如果我们按多列进行比较,则

melt可能是更好的选择。重塑为“长”格式,然后将i与条件!is.na(value)一起使用,同时按“变量”分组并获得指定变量的minmax

library(data.table)
melt(irisdt,  measure = c('Sepal.Length', 'Sepal.Width'))[!is.na(value),
   .(max = max(Petal.Length), min = min(Petal.Length)), .(variable)]

如果我们对多个变量执行此操作,请使用lapply(.SD, ...