为传递给 MAPPLY 的多列 IF 语句获取 NULL 值

Getting NULL values for a multiple column IF statement passed to MAPPLY

我有一个数据框:

df <- data.frame(x = c(11, 3, 2, 7, 9, 4, 6, 1, 6, 7),
                 y = c(rep("a",5), rep("b",5)))

df
    x y
1  11 a
2   3 a
3   2 a
4   7 a
5   9 a
6   4 b
7   6 b
8   1 b
9   6 b
10  7 b

我想做的是在 x 和 y 列上使用 IF 语句,它根据满足 x 和 y 的条件分配一个新值 (z)。

myfun <- function(x,y) {
  if(x < 3 & y=="a") z <- 1
  if(x>=3 & x <=7 & y=="a") z <- 2
  if(x>7 & y=="a") z <- 3
  if(x<3 & y=="b") z <-4
  if(x>=3 & x<=1 & y=="b") z <-5
  if(x>7 & y=="b") z<-6
}

我试图根据上述逻辑得到以下结果:

df
    x y z
1  11 a 3
2   3 a 2
3   2 a 1
4   7 a 2
5   9 a 3 
6   4 b 5
7   6 b 5
8   1 b 4
9   6 b 5
10  7 b 5

df$z <- mapply(myfun, df$x, df$x) 

这导致:

x y    z
1  11 a NULL
2   3 a NULL
3   2 a NULL
4   7 a NULL
5   9 a NULL
6   4 b NULL
7   6 b NULL
8   1 b NULL
9   6 b NULL
10  7 b NULL

我不知道为什么。有人可以解释我哪里出错了吗?

if() 函数不应该用于向量(或列)。它用于单个对象比较,如 if(switch=="on")。您应该使用的是 ifelse() 函数。您的前三个条件将变为:

myfun <- function(df) {
  df$z <- with(df, ifelse(x < 3 & y=="a",1,NA))
  df$z <- with(df, ifelse(x>=3 & x <=7 & y=="a",2,df$z))
  df$z <- with(df, ifelse(x>7 & y=="a",3,df$z))
  ...
}

编辑:在函数调用中使用 df$x 和 df$y 可能不是必需的。 "result <- myfun(df)" 就足够了,除非您希望 x 和 y 不同。