1

在 R 中,any-Function 应用于结果为布尔值的列。逐行应用它的最佳方法是什么?在这种情况下,我的目标是对 A 进行重新编码,如果 A、B 或 C 中的任何一个为 1 或 6。(如果 TRUE TEST$NEW 应为 101)

这是我的数据框:

  A B C D
  1 1 1 "A"
  2 1 2 "B" 
  3 6 3 "C"
  5 3 5 "D"

可以通过这种方式完成,但应该有一个更聪明的解决方案:

TEST$NEW <- ifelse(TEST$A == 1 | TEST$B == 1 | TEST$C == 1 | TEST$A == 6 | TEST$B == 6 | TEST$C == 6, 101, NA)
4

3 回答 3

4
TEST$NEW <- ifelse(apply(TEST,1,function(x) any(x==1|x==6)),101,NA)
于 2013-02-12T11:01:20.613 回答
2

一种方法,但可能有一种更简单的方法:

df <- read.table(textConnection('A B C D
1 1 1 "A"
2 1 2 "B" 
3 6 3 "C"
5 3 5 "D"'), header=TRUE)

test <- rowSums(sapply(df[,c("A","B","C")], function(v) v %in% c(1,6)))
df$TEST <- ifelse(test>0, 101, NA)

这使 :

  A B C D TEST
1 1 1 1 A  101
2 2 1 2 B  101
3 3 6 3 C  101
4 5 3 5 D   NA
于 2013-02-12T10:58:46.427 回答
1

另一种方法:

TEST$NEW <- 101 * apply(TEST, 1, function(x) any(x %in% c(1, 6))) ^ NA

  A B C D NEW
1 1 1 1 A 101
2 2 1 2 B 101
3 3 6 3 C 101
4 5 3 5 D  NA
于 2013-02-12T11:51:47.223 回答