2013-11-24 70 views
3

我有以下列表:組變量使用特定列表

group1<-c("A", "B", "D") 
    group2<-c("C", "E") 
    group3<-c("F") 

,並與值的數據幀和相應的名稱:

df <- data.frame (name=c("A","B","C","D","E","F"),value=c(1,2,3,4,5,6)) 
    df 
    name value 
    1 A  1 
    2 B  2 
    3 C  3 
    4 D  4 
    5 E  5 
    6 F  6 

我想對數據進行分組基於列表,使用名稱列;

df 
    name value group 
    1 A  1 group1 
    2 B  2 group1 
    3 C  3 group2 
    4 D  4 group1 
    5 E  5 group2 
    6 F  6 group3 

和求和值的每個組。

df 
     group sum 
    1 group1 7 
    2 group2 8 
    3 group3 6 

我已經搜索過類似的帖子,但沒有使用它們來解決我的問題。

回答

1

這是一種方法。首先,使用ifelse將組分配給每個name,然後使用aggregate獲得每個group的總和。

> df$group <- with(df, ifelse(name %in% group1, "group1", 
           ifelse(name %in% group2, "group2", "group3"))) 
> aggregate(value ~ group, sum, data=df) 
    group value 
1 group1  7 
2 group2  8 
3 group3  6 
+1

工作,非常感謝! – user2904120

+0

還有一個問題,假設最初的df包含多個值列(value1,value2,value2),那麼將聚合應用於所有列的最佳方式是什麼。 – user2904120

+0

嘗試'聚合(cbind(value1,value2,...,valueN)〜group,sum,data = df)' –

1

另一個想法:

df$X <- factor(df$name) 
levels(df$X) <- list(group1 = group1, group2 = group2, group3 = group3) 
aggregate(df$value, list(group = df$X), sum) 
# group x 
#1 group1 7 
#2 group2 8 
#3 group3 6 

編輯

正如下面您的評論注意到@thelatemail可以mget -in一個列表 - 在您的工作空間中的所有對象稱爲「GROUP_ 「,如下所示:

mget(ls(pattern="group\\d+")) 

但是,如果您已加載 - 支持 - 稱爲「group4」的功能,則此功能也將在ls()中選擇。爲了避免這種情況的方法是使用類似:

.ls <- ls(pattern="group\\d+") 
mget(.ls[!.ls %in% apropos("group", mode = "function")]) #`mget` only non-functions. 
                 #You can, of course, avoid any 
                #other `mode`, besides "function". 

單從mget返回可以的話,可以用作levels(df$X)

+0

我認爲這是解決問題的最R-ISH方式,非常簡潔。構建命名列表的要求可以通過如下方式避免:'levels(df $ X)< - mget(ls(pattern =「group \\ d +」))' – thelatemail

+0

@thelatemail:哈,正是我在想什麼!但是當我使用'pattern =「group」'時,我的一個被加載的函數'groupby'也被返回了,然後我沒有花費更多的時間。然而,你的想法,然後是'grep'ping「group」後跟一個數字是最好的選擇。我將使用我製作的解決方法編輯我的答案,但如果您有更好的添加內容,請隨時編輯。謝謝! –

1

我建議讓您的分組作爲data.frame,東西沿着這些線路 -

grouping <- data.frame(name=c("A","B","C","D","E","F"),groupno=c(1,1,1,2,2,3)) 
df2 <- merge(df,grouping, by = 'name') 
aggregate(value ~ groupno, sum, data=df2) 
相關問題