gpt4 book ai didi

r - ifelse 没有按预期遍历行

转载 作者:行者123 更新时间:2023-12-01 13:42:15 26 4
gpt4 key购买 nike

我有这样的数据:

 df <- read.table(tc <- textConnection("
var1 var2 var3 var4
1 1 7 NA
4 4 NA 6
2 NA 3 NA
4 4 4 4
1 3 1 1"), header = TRUE); close(tc)

我正在尝试创建一个新列,如果有匹配则返回 1,如果没有则返回 0。

我的非工作代码如下所示:

 df$var5 = ifelse("1" %in% df$var1,1,
ifelse("1" %in% df$var2,1,
ifelse("1" %in% df$var3,1,
ifelse("1" %in% df$var4,1,0))))

给我一​​张 table :

 var1    var2    var3    var4   var5
1 1 7 NA 1
4 4 NA 6 1
2 NA 3 NA 1
4 4 4 4 1
1 3 1 1 1

我真正想要的表格应该是这样的

    var1    var2    var3    var4   var5
1 1 7 NA 1
4 4 NA 6 0
2 NA 3 NA 0
4 4 4 4 0
1 3 1 1 1

我看了帖子:

ifelse not working as expected in R

Loop over rows of dataframe applying function with if-statement

但我的问题没有得到任何答案。

最佳答案

正确的做法应该是

with(df, ifelse(var1 %in% 1,1,
ifelse(var2 %in% 1,1,
ifelse(var3 %in% 1,1,
ifelse(var4 %in% 1,1,0)))))
#[1] 1 0 0 0 1

原因是 1 %in% df1$var1 只返回一个元素 1。

1 %in% df$var1
#[1] TRUE

同样,在所有列中,都有 1,因此它将为所有 ifelse 返回 TRUE,从而得到值 1。

相反

df$var1 %in% 1
#[1] TRUE FALSE FALSE FALSE TRUE

返回与原始列具有相同长度 的逻辑向量。本质上,通过使用 %in%,返回的长度将基于 % 的 lhs 中对象的 length在%


不需要 ifelse,更好的选择是在逻辑矩阵 (df ==1) 上使用 rowSum , 并判断是否不等于0,用as.integer 转成二进制。

as.integer(rowSums(df == 1, na.rm =TRUE)!=0)
#[1] 1 0 0 0 1

或者另一种选择是 Reduce with |

as.integer(Reduce(`|`, lapply(replace(df, is.na(df), 0), `==`, 1)))
#[1] 1 0 0 0 1

关于r - ifelse 没有按预期遍历行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39036575/

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