【问题标题】:Apply a function to each column with a condition in data.table [R]将函数应用于具有 data.table [R] 中的条件的每一列
【发布时间】:2020-01-14 23:03:23
【问题描述】:

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

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 应用于多个列,我会这样:

## 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

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

## Here is what the table would look like
desired_table <- rbind(
  irisdt[!is.na(Sepal.Length), .(max = max(Petal.Length), min = min(Petal.Length), var = "Sepal.Length")],
  irisdt[!is.na(Sepal.Width), .(max = max(Petal.Length), min = min(Petal.Length), var = "Sepal.Width")]
)

desired_table
#>    max min          var
#> 1: 6.9 1.2 Sepal.Length
#> 2: 6.7 1.0  Sepal.Width

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

我有什么想法可以做到这一点吗?

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    melt 如果我们按多列进行比较,可能是更好的选择。 reshape成'long'格式,然后使用i和条件!is.na(value),同时按'variable'分组,得到指定变量的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, ...

    【讨论】:

    • 谢谢!但这实际上并没有解决逻辑的使用问题。也就是说,对于nm1 的每个值,我想通过非 NA 的值进一步对每个值进行子集化。
    • @boshek 抱歉,我错过了那部分。已更正
    • 这很棒。这可能更简洁:melt(irisdt, measure = c('Sepal.Length', 'Sepal.Width'), na.rm = TRUE)[,.(max = max(Petal.Length), min = min(Petal.Length)), .(variable)]
    • @boshek 是的,我确实考虑过na.rm = TRUE,但留下它来展示我们如何指定i。它也可以是任何其他表达式
    猜你喜欢
    • 1970-01-01
    • 2017-05-12
    • 2013-03-18
    • 1970-01-01
    • 2015-07-08
    • 2023-03-06
    • 2018-11-10
    • 2020-02-15
    • 2011-07-11
    相关资源
    最近更新 更多