2017-03-23 45 views
1

我有一個數據框,如下面的結構。計算一個組的總值,同時保留數據幀中另一列的信息

# Create example data 
ex_df <- data.frame(
    Date = as.Date(c("2000-01-01", "2000-01-02", "2000-01-03", "2000-01-03", 
        "2000-01-04", "2000-01-04", "2000-01-05", "2000-01-05", 
        "2000-01-05")), 
    Value = c(1, 3, 1, 2, 5, 2, 1, 3, 1), 
    Label = c("A", "B", "A", "A", 
      "B", "A", "A", "A", "B"), 
    stringsAsFactors = FALSE) 

ex_df 
#   Date Value Label 
# 1 2000-01-01  1  A 
# 2 2000-01-02  3  B 
# 3 2000-01-03  1  A 
# 4 2000-01-03  2  A 
# 5 2000-01-04  5  B 
# 6 2000-01-04  2  A 
# 7 2000-01-05  1  A 
# 8 2000-01-05  3  A 
# 9 2000-01-05  1  B 

我想計算每個DateValue,同時保持信息在Label列。期望的輸出將如下。

#  Date Value Label 
#1 2000-01-01  1  A 
#2 2000-01-02  3  B 
#3 2000-01-03  3  A 
#4 2000-01-04  7  B 
#5 2000-01-05  5  B 

在該數據幀中,我想LabelAB如果全部來自同一Date的行具有相同的標記,如在2000-01-03的情況。但是,如果來自同一Date的行具有不同的標籤,我希望LabelB,例如2000-01-042000-01-05中的情況。

我知道我可以使用dplyr包來計算組合總值,如下所示。

library(dplyr) 
ex_df %>% 
    group_by(Date) %>% 
    summarise(Value = sum(Value)) 

但我怎麼能保持在Label列中的信息?我不僅歡迎使用dplyr的解決方案,還歡迎data.table,base R或其他軟件包。

謝謝。

回答

2

您可以檢查是否B標籤爲一組,如果是,在總結返回B否則返回A

library(dplyr) 
ex_df %>% group_by(Date) %>% 
    summarise(Value = sum(Value), Label = if("B" %in% Label) "B" else "A") 

# A tibble: 5 × 3 
#  Date Value Label 
#  <date> <dbl> <chr> 
#1 2000-01-01  1  A 
#2 2000-01-02  3  B 
#3 2000-01-03  3  A 
#4 2000-01-04  7  B 
#5 2000-01-05  5  B 
+0

這種運作良好。非常感謝你。 @Psidom – www

+0

對於這個特定的情況,有'Label = max(Label)'。只要Label是一個適當的有序因子,它可以更普遍地工作(可能)。 (哦,剛剛看到P顯示了答案中的第一個選項。) – Frank

+0

@Frank同意'max'在這裏是一個很好和簡潔的選項。 – Psidom

2

另一種方法是對標籤

使用 max
ex_df %>% 
group_by(Date) %>% 
summarise(Value = sum(Value),label=max(Label)) 
# A tibble: 5 x 3 
     Date Value label 
     <date> <dbl> <chr> 
1 2000-01-01  1  A 
2 2000-01-02  3  B 
3 2000-01-03  3  A 
4 2000-01-04  7  B 
5 2000-01-05  5  B 
+0

謝謝。這是一個很好的解決方案。 @P Lapointe – www

1

這裏是data.table一個解決方案:

library("data.table") 
# Create example data 
ex_df <- data.table(
    Date = as.Date(c("2000-01-01", "2000-01-02", "2000-01-03", "2000-01-03", 
        "2000-01-04", "2000-01-04", "2000-01-05", "2000-01-05", 
        "2000-01-05")), 
    Value = c(1, 3, 1, 2, 5, 2, 1, 3, 1), 
    Label = c("A", "B", "A", "A", "B", "A", "A", "A", "B"), 
    stringsAsFactors = FALSE) 
foo <- function(x) { u <- unique(x); ifelse(length(u)==1, u, "B") } 
ex_df[, .(Value=sum(Value), Label=foo(Label)), by=Date] 
#   Date Value Label 
# 1: 2000-01-01  1  A 
# 2: 2000-01-02  3  B 
# 3: 2000-01-03  3  A 
# 4: 2000-01-04  7  B 
# 5: 2000-01-05  5  B 

較短的變體:

ex_df[, .(Value=sum(Value), Label=max(Label)), by=Date] 
+0

謝謝。短的變體只需要一行代碼,太棒了! – www

相關問題