根据另一个变量的值调用不同的变量
问题描述:
我有一列A,其值为字符a,b,c;然后我有三个其他栏也被称为a,b和c; 我想创建一个列Z,它等于A =='a'时的值,当A =='b'时为b的值,当A =='c'时为c; 我:根据另一个变量的值调用不同的变量
**A | a | b | c**
a | 1 | 0,7 | 3,4
a | 1,1 | 0,8 | 3,5
c | 1,15 | 0,9 | 3,4
b | 1,1 | 0,7 | 3,4
,我想创建ž这样的:
**A | a | b | c | Z**
a | 1 | 0,7 | 3,4| 1
a | 1,1 | 0,8 | 3,5| 1,1
c | 1,15 | 0,9 | 3,4| 3,4
b | 1,1 | 0,7 | 3,4| 0,7
这是一个简单的例子,但实际上是一个有30种多方式,我可以很容易地与许多ifelse做到这一点,但我需要做的是在一个整洁的方式,因为我有一个巨大的OBS量
答
使用sapply搭配:
#data
df1 <- read.table(text = "A|a|b|c
a|1|0,7|3,4
a|1,1|0,8|3,5
c|1,15|0,9|3,4
b|1,1|0,7|3,4", header = TRUE, sep = "|")
# add matching column to Z
df1$Z <- sapply(1:nrow(df1), function(i)
df1[i, match(df1[i, "A"], colnames(df1))])
df1
# A a b c Z
# 1 a 1 0,7 3,4 1
# 2 a 1,1 0,8 3,5 1,1
# 3 c 1,15 0,9 3,4 3,4
# 4 b 1,1 0,7 3,4 0,7
+0
@MCmr见更新。 – zx8754
答
您可以使用apply函数来执行此操作:
df <- data.frame("A" = c("a","a","b","c"),
"a" = seq(1,4),
"b" = seq(5,8),
"c" = seq(9,12)
,stringsAsFactors = F)
df$Z <- apply(df,1,function(x){
return(x[x["A"]])
})
A a b c Z
1 a 1 5 9 1
2 a 2 6 10 2
3 b 3 7 11 7
4 c 4 8 12 12
请阅读'?get'。 – r2evans