2012-10-17 55 views
3

附ifelse功能是一些R代碼裏面:聚集和分別在R

temp_df <- data.frame(c("A","A","A","G","G","Z","Z"), 
        c("B","D","E","R","S","Y","U"), 
        c(1.5,1.1,0.8,0.2,0.8,0.9,0.1), 
        c(0.8,0.4,1.5,1.2,1.2,0.2,0.3), 
        c(2.7,2.7,2.7,2.4,2.4,0.5,0.5), 
        c("YES","NO","NO","NO","NO","YES","YES")) 

colnames(temp_df) <- c("PERSON_1","PERSON_2","VALUE_1", 
        "VALUE_2","TOTAL_2","DECISION_2") 

我所試圖做的是創建基於以下規則被稱爲「NEW_DECISION_1」新列:

爲人民在第1列(「PERSON_1」)中,如果第5列(「TOTAL_2」)中的相應值的值大於或等於2.0,並且第6列中的相應值中有至少一個「YES」(「DECISION_2 「),則」NEW_DECISION_1「列的值將爲」是「,如果這些條件不滿足,則它們將得到」NO「值。

因此,對於第1列中的A人,由於第5列中的值爲2.7,並且列6中對應值中至少有一個「是」,所以新列中的值將爲「是」。

對於第1列中的G人,由於第5列中的值爲2.4,但由於第6列中相應值中沒有「YES」值,所以新列中的值將爲「NO」。

對於第1列中的Z人員,由於第5列中的值爲1.0,並且第6列中對應值中至少有一個「是」,所以新列中的值將爲「否」。 所以新表將是:

temp_df$NEW_DECISION_1 <- c("YES","YES","YES","NO","NO","NO","NO") 
temp_df 

我想到某種聚集規則的,但我不知道什麼函數用來搜索「至少一個‘YES’」。

如果您需要更多信息或澄清,請讓我知道。

回答

4

下面是與ddply一個解決方案:

library(plyr) 
ddply(temp_df, .(PERSON_1), transform, 
     NEW_DECISION_1 = c("NO", "YES")[(TOTAL_2 >= 2 & 
             sum(DECISION_2 == "YES") > 0) + 1]) 

# PERSON_1 PERSON_2 VALUE_1 VALUE_2 TOTAL_2 DECISION_2 NEW_DECISION_1 
# 1  A  B  1.5  0.8  2.7  YES   YES 
# 2  A  D  1.1  0.4  2.7   NO   YES 
# 3  A  E  0.8  1.5  2.7   NO   YES 
# 4  G  R  0.2  1.2  2.4   NO    NO 
# 5  G  S  0.8  1.2  2.4   NO    NO 
# 6  Z  Y  0.9  0.2  0.5  YES    NO 
# 7  Z  U  0.1  0.3  0.5  YES    NO 
+0

歡呼斯文的大型快速和準確的答案:) –

4

這裏的基礎R解決方案:

result <- by(temp_df, 
    INDICES=temp_df$PERSON_1, 
    FUN=function(x) 
    within(x, DECISION_1 <- ifelse(any(grepl('YES', DECISION_2)) & TOTAL_2 >= 2, 
            'YES', 'NO'))) 
do.call(rbind, result) 

#  PERSON_1 PERSON_2 VALUE_1 VALUE_2 TOTAL_2 DECISION_2 DECISION_1 
# A.1  A  B  1.5  0.8  2.7  YES  YES 
# A.2  A  D  1.1  0.4  2.7   NO  YES 
# A.3  A  E  0.8  1.5  2.7   NO  YES 
# G.4  G  R  0.2  1.2  2.4   NO   NO 
# G.5  G  S  0.8  1.2  2.4   NO   NO 
# Z.6  Z  Y  0.9  0.2  0.5  YES   NO 
# Z.7  Z  U  0.1  0.3  0.5  YES   NO 
+0

乾杯mplourde。您的回覆非常快速準確,但只允許選中其中一個答案。它仍然是非常有用的未來的代碼:) –