2016-07-07 108 views
1

我有一列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量

+0

请阅读'?get'。 – r2evans

回答

2

使用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

0

您可以使用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 
相关问题