我想将几个函数应用于一列,但是我想对执行此操作应用一些逻辑,在这种情况下,当另一列具有某些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创建
关于如何实现此目标的任何想法?
答案 0 :(得分:7)
melt
可能是更好的选择。重塑为“长”格式,然后将i
与条件!is.na(value)
一起使用,同时按“变量”分组并获得指定变量的min
和max
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, ...