2014-03-14 60 views
1

之前元素data.frame專欄中,我問這個問題:Moving certain elements of data frame into new columns (in R)創建具有取決於其他兩列(以R)

現在,我有相同的數據幀:

> jiz <- data.frame(Type=c("X","B","B","B","B","X","B"), 
+     Action=c("both","1","2","2","1","both","1")) 
> jiz 
    Type Action 
1 X both 
2 B  1 
3 B  2 
4 B  2 
5 B  1 
6 X both 
7 B  1 

我想構造一個取決於「類型」和「動作」兩列中的值的新列,稱爲「結果」,具有三個值「X」,「Y」和「Z」。

如果數據類型爲 'X' 和行動是 '兩者' - > 「結果」 是X

如果數據類型爲 'B' 和行動是 '1' - > 「結果」 爲Y

如果數據類型爲 'B' 和動作是 '2' - > 「結果」 是Z,

,使得新的數據幀變爲:

> jiz.new 
    Type Action Result 
1 X both  X 
2 B  1  Y 
3 B  2  Z 
4 B  2  Z 
5 B  1  Y 
6 X both  X 
7 B  1  Y 

變換+ ifelse,從交我鏈接到上面,在這裏不適合我,因爲我有更多的t wo組合進入/創建相同的新列。

回答

1

首先,定義一個函數:

conditionalResult <- function(argtype, argaction){ 
if (argtype=="X" & argaction=="both") 
    return("X") 
if (argtype=="B" & argaction==1) 
    return("Y") 
if (argtype=="B" & argaction==2) 
    return("Z") 

後函數定義轉換您的數據data.table:

install.packages("data.table") 
require("data.table") 
jiz <- as.data.table(jiz) 

,並創建一個新的條件柱:

jiz[, c("Result"):=conditionalResult(Type, Action)] 

瞧,現在你的data.table中有一個名爲Result的新列和相應的值。

+1

或者,如果你不想使用data.table,使用jiz $結果<-sapply(jiz $類型,conditionalResult,argaction = jiz $行動) – annndrey

+0

非常感謝你,@annndrey – Erosennin

+0

使用數據幀的方法,這是我想要的,我得到這個: {> jiz $ Result <-sapply(jiz $ Type,conditionalResult,argaction = jiz $ Action) 有17個警告(使用警告()看到它們) >警告() 警告消息: 1:在if(argtype ==「X」&argaction ==「both」)return(「X」): 條件長度> 1且僅使用第一個元素 2:In if(argtype ==「X」&argaction ==「both」)return(「X」): th e條件的長度> 1,只有第一個元素將被使用} – Erosennin