[英]R: Aggregate (sum) based on a single column but keep all other columns?
我正在處理一個包含許多列的數據集。 我想知道是否有一種方法可以基於單個列聚合行但保留所有其他列。
我知道這樣做:
aggregate(data$col.to.be.summed, by=list(data$col1, data$col2, data$col3), FUN=sum)
但是,我有超過 60 列,所以沒有列表 function 有沒有辦法做到這一點? 即只是告訴 R 包括所有其他列?
為了 arguments 的緣故,數據等價於所有其他列包含多個行上每個采樣事件的相同信息(但有更多列):
> col.to.be.summed col1 col2 col3
> 0 1 XX A
> 2 1 XX A
> 0 1 XX A
> 0 2 XX B
> 0 3 YY A
> 4 3 YY A
我想結束這個:
> col.to.be.summed col1 col2 col3
> 2 1 XX A
> 0 2 XX B
> 4 3 YY A
我想有一個簡單的命令告訴 R 保留所有其他列而不手動列出它們,但是經過數小時的搜索后我找不到它:/
非常感謝任何幫助!
您可以使用reformulate
動態創建一個可以在aggregate
中使用的公式。
aggregate(reformulate(names(data)[-1], 'col.to.be.summed'), data, sum)
在哪里
reformulate(names(data)[-1], 'col.to.be.summed') #returns
#col.to.be.summed ~ col1 + col2 + col3
您可以將names(data)[-1]
替換為要分組的列。 這也適用names(data)[2:4]
。
這是一個dplyr
解決方案:
library(dplyr) # Version > 1.0.0
data %>%
group_by(across(-col.to.be.summed)) %>%
summarise(x = sum(col.to.be.summed, na.rm = TRUE))
# A tibble: 3 x 4
# Groups: col1, col2 [3]
col1 col2 col3 x
<int> <chr> <chr> <int>
1 1 XX A 2
2 2 XX B 0
3 3 YY A 4
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.