我想创建一个变量,该变量从数值向量中获取值,以因子变量为条件。
我有一个数字向量
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]
答案 0 :(得分:2)
如果NA
不是y
,z
或A
,这将执行您所描述的内容并将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
不是A
,B
,C
,您的帖子中不清楚会发生什么情况;如果您的实际需求更复杂,嵌套的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已更改了数据。它仍然有效。