根据因子变量为变量赋值

时间:2014-10-22 17:43:43

标签: r conditional vectorization

我想创建一个变量,该变量从数值向量中获取值,以因子变量为条件。

我有一个数字向量

x <- c(0, 1000, 50000)

数据框:

df <- data.frame(ID = seq(1:8), z = c("A", "A", "C", NA, "B", "A", NA, NA)) 
   ID    z
 1  1    A
 2  2    A
 3  3    C
 4  4 <NA>
 5  5    B
 6  6    A
 7  7 <NA>
 8  8 <NA> 

我想创建一个变量y,如果x[1],则z=="A"x[2] z=="B"x[3] z=="C" 1}}。

我想要的输出

   ID    z   y
1   1    A   0
2   2    A   0
3   3    C   50000
4   4    NA  NA
5   5    B   1000
6   6    A   0
7   7    NA  NA
8   8    NA  NA

我试过

df$y[which(df$z == "A")] <- x[1]
df$y[which(df$z == "B")] <- x[2]
df$y[which(df$z == "C")] <- x[3]

3 个答案:

答案 0 :(得分:2)

如果NA不是yzA,这将执行您所描述的内容并将B插入C

set.seed(84)
df <- data.frame(z = sample(LETTERS[1:11], 15, replace = TRUE))
x <- c(0,1000,50000)

df$y <- ifelse(df$z == "A", x[1], ifelse(df$z == "B", x[2], ifelse(df$z == "C", x[3], NA)))

df
#    z     y
# 1  I    NA
# 2  D    NA
# 3  J    NA
# 4  I    NA
# 5  C 50000
# 6  C 50000
# 7  B  1000
# 8  D    NA
# 9  G    NA
# 10 B  1000
# 11 I    NA
# 12 K    NA
# 13 J    NA
# 14 K    NA
# 15 A     0

如果z不是ABC,您的帖子中不清楚会发生什么情况;如果您的实际需求更复杂,嵌套的ifelse()语句将变得非常繁琐。

答案 1 :(得分:1)

你可以尝试:

  df$y <- x[as.numeric(df$z)]

如果column z不是factor

  df$y <- x[as.numeric(factor(df$z))]    
  head(df)
  #  ID z     y
  #1  1 C 50000
  #2  2 B  1000
  #3  3 H    NA
  #4  4 F    NA
  #5  5 G    NA
  #6  6 K    NA

数据

set.seed(24)
df <- data.frame(ID=1:40, z=sample(c(NA, LETTERS[1:11]), 40, replace=TRUE))   

答案 2 :(得分:1)

您可以尝试match。这会使用NA

填充不匹配的值
df$y <- x[match(df$z, c("A", "B", "C"))]
df
#   ID z     y
# 1  1 A     0
# 2  2 A     0
# 3  3 C 50000
# 4  4 D    NA
# 5  5 B  1000
# 6  6 A     0
# 7  7 H    NA
# 8  8 E    NA

请注意,自从我发布原始答案后,OP已更改了数据。它仍然有效。