2017-08-16 85 views
0

我有一個數據幀df_workingFile:如何快速彙總作爲新列列的數據幀[R]

group | value 
a  | 1 
a  | 3 
b  | 2 
b  | 2 

我要添加兩個新列 - 一個用於最小值和最大值爲每個組

group | value | max | min 
a  | 1 | 3 | 1 
a  | 3 | 3 | 1 
b  | 2 | 2 | 2 
b  | 2 | 2 | 2 

現在我正在遍歷每一行並獲取組的子集數據的最小/最大值,但對於大型數據集來說這確實很慢。什麼是這樣做的有效方式?

+2

'DF $最大= AVE(DF $值,DF $基,FUN =最大值); df $ min = ave(df $ value,df $ group,FUN = min)' –

+0

@Henrik我認爲你在結束問題時有點苛刻,因爲重複。不一定是這個,但今天我跑到另外兩個帖子,你把它們標記爲模糊,我不太確定它們是否是這些線程的重複。當然你是金獾;) – Masoud

+0

@Masoud感謝您的反饋!如果您願意,請隨時[重新投票](https://meta.stackexchange.com/questions/36415/how-do-you-reopen-a-closed-question)。 (我剛剛檢查了我最近遇到的十個問題 - 迄今爲止沒有重新投票,這可能表明SO同行同意我選擇關閉以及選擇重複目標)。 – Henrik

回答

4

隨着dplyr包,你可以做到以下幾點:

df_workingFile %>% 
    group_by(group) %>% 
    mutate(max = max(value), min = min(value)) %>% ungroup() 

    # A tibble: 4 x 4 
    group value min max 
    <chr> <dbl> <dbl> <dbl> 
1  a  1  1  3 
2  a  3  1  3 
3  b  2  2  2 
4  b  2  2  2 
0

使用plyr包:

library(plyr) 
ddply(df, "group", transform, max = max(value), min = min(value)) 

# group value max min 
# 1  a  1 3 1 
# 2  a  3 3 1 
# 3  b  2 2 2 
# 4  b  2 2 2 

使用data.table包:

library(data.table) 
setDT(df)[, max := max(value), by = group][, min := min(value), by = group] 

# group value max min 
# 1:  a  1 3 1 
# 2:  a  3 3 1 
# 3:  b  2 2 2 
# 4:  b  2 2 2 

使用mergeaggregate基礎R溶液:

merge(df, setNames(aggregate(value ~ group, data = df, range),c("group","range")), 
       by = "group", suffixes = c("","")) 

# group value range.1 range.2 
# 1  a  1  1  3 
# 2  a  3  1  3 
# 3  b  2  2  2 
# 4  b  2  2  2 

注:後者溶液的結構將是有點棘手。使用時請謹慎。

數據:

df <- structure(list(group = structure(c(1L, 1L, 2L, 2L), .Label = c("a", 
     "b"), class = "factor"), value = c(1L, 3L, 2L, 2L)), .Names = c("group", 
     "value"), class = "data.frame", row.names = c(NA, -4L))