gpt4 book ai didi

r - 将函数应用于具有 data.table [R] 中的条件的每一列

转载 作者:行者123 更新时间:2023-12-04 11:46:35 24 4
gpt4 key购买 nike

我想将几个函数应用于一列,但我想在执行此操作时应用一些逻辑,在这种情况下,当另一列有一些 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 创建于 2020-01-14| (v0.3.0)

关于我如何实现这一点的任何想法?

最佳答案

melt如果我们按多列进行比较,可能是更好的选择。 reshape 为“长”格式,然后使用 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, ...

关于r - 将函数应用于具有 data.table [R] 中的条件的每一列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59743005/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com