gpt4 book ai didi

r - 如何测试 R 中一系列列的条件

转载 作者:行者123 更新时间:2023-12-04 22:41:33 26 4
gpt4 key购买 nike

我正在尝试测试一系列列中的条件。数据看起来像这样

      Name DPD_1 DPD_2 DPD_3 Default_flag
1: A 46 63 138 TRUE
2: B 12 82 33 FALSE
3: C 95 71 55 TRUE
4: D 57 133 116 TRUE
5: E 48 27 137 TRUE

在代码中,我需要测试 DPD_1、DPD_2 或 DPD_3 中的任何一个是否大于 90,在这种情况下 Default_flag 设置为 TRUE。

我为此使用的代码如下
df1 <- data.table(Name = LETTERS[1:10],DPD_1 = sample(1:100,10),DPD_2 = sample(1:200,10),DPD_3 = sample(1:200,10) )
df1[,Default_flag := ifelse((DPD_1>=90 | DPD_2>=90 | DPD_3>=90 ),TRUE,FALSE)]

现在问题出在一些数据集上,我需要将 DPD 检查从 DPD_1 增加到 DPD_24(检查 24 列,而不是当前示例中的 3 列)。无论如何我可以避免在 ifelse 语句中指定每个 DPDnumber。我很高兴失去 ifelse 语句,如果某些版本的 apply 可以工作,我也很乐意使用它。

最佳答案

Reduce 中指定感兴趣的列后,我们可以将 |.SDcols 一起使用

df1[, Default_flag :=  Reduce(`|`, lapply(.SD, `>=`, 90)), .SDcols = DPD_1:DPD_3]

更新

根据OP的评论,如果我们需要创建一个函数来自动检测列名,那么使用 grep根据模式获取列名。下面的函数采用数据集、模式 ('pat')、要比较的值 ('val') 和 'n',即特定模式的列数
f1 <- function(dat, pat, val, n){
tmp <- as.data.table(dat)
nm1 <- head(grep(pat, names(tmp), value = TRUE), n)
tmp[, Default_flag := Reduce(`|`,lapply(.SD, `>=`, val)), .SDcols = nm1][]
}

f1(df1, "DPD", 90, 2)
f1(df1, "DPD", 90, 3)

根据@aelwan 的请求,使用 tidyverse 的选项是
library(tidyverse)
f2 <- function(dat, pat, val, n){
pat <- quo_name(enquo(pat))
nm1 <- head(grep(pat, names(dat), value = TRUE), n)

dat %>%
mutate_at(vars(nm1), funs(.>= val)) %>%
select_at(nm1) %>%
reduce(`|`) %>%
mutate(dat, Default_flag = .)

}

f2(df1, DPD, 90, 2)
f2(df1, DPD, 90, 3)
identical(f1(df1, "DPD", 90, 2), as.data.table(f2(df1, DPD, 90, 2)))
#[1] TRUE
identical(f1(df1, "DPD", 90, 3), as.data.table(f2(df1, DPD, 90, 3)))
#[1] TRUE

关于r - 如何测试 R 中一系列列的条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46127206/

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