为传递给 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 不同。
我有一个数据框:
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 不同。