2016-07-07 104 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 
相關問題