這個問題在這里已經有了答案: 對具有相似名稱的列按行求和 (5 個答案) 在 R 中的多列中有效求和 (6 個回答) 23 小時前關閉。
假設我有這個資料框:
> df <- data.frame(a1=c(1, 2, 3, 4, 5), b1=c(5, 4, 3, 2, 1), b2=c(10, 11, 12, 13, 14), a2=c(5, 6, 7, 8, 9), c1=c(100, 200, 300, 400, 500))
> df
a1 b1 b2 a2 c1
1 1 5 10 5 100
2 2 4 11 6 200
3 3 3 12 7 300
4 4 2 13 8 400
5 5 1 14 9 500
>
如您所見,我有a1 a2兩個以 開頭的列a,我想按行對它們求和并僅生成一列a,與 column 相同b。同樣對于c列,只有一c列應該保持不變,因為只有一列以c.
期望的輸出:
a b c
1 6 15 100
2 8 15 200
3 10 15 300
4 12 15 400
5 14 15 500
來自 Python,在 熊貓 (Python 庫),我可以簡單地使用:
df.groupby(df.columns.str[:1], axis=1).sum()
但我不確定如何在 R 中做到這一點。
我試過dplyr:
df %>% group_by(sub(".$", "", colnames(df))) %>%
mutate(across(colnames(.), sum))
但是出現了一個錯誤。R 新手。
uj5u.com熱心網友回復:
as.data.frame(lapply(unique(sapply(names(df), function(x) grep(substr(x,1,1), names(df)))), function(y) if(is.na(y[2])) df[[y[1]]] else df[[y[1]]] df[[y[2]]]))
c.6..8..10..12..14. c.15..15..15..15..15. c.100..200..300..400..500.
1 6 15 100
2 8 15 200
3 10 15 300
4 12 15 400
5 14 15 500
然后,您可以使用以下方法設定名稱:
unique(substr(names(df),1,1))
[1] "a" "b" "c"
正如評論:
sapply(unique(sub(".$", "", colnames(df))), function(x) rowSums(df[startsWith(colnames(df), x)]))
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/313015.html
上一篇:提取資料缺失的日期范圍
