[英]R: Sum values based on 2 condition from 2 data frame of different length
[英]Sum columns based on index in a a different data frame in R
我有兩個與此類似的數據框:
df<-data.frame("A1"=c(1,2,3), "A2"=c(3,4,5), "A3"=c(6,7,8), "B1"=c(3,4,5))
ref_df<-data.frame("Name"=c("A1","A2","A3","B1"),code=c("Blue" ,"Blue","Green","Green"))
我想根據 ref_df 中的代碼對 df 列中的值求和。 我想將結果存儲在一個新的數據框中,列名與 ref_df 中的代碼匹配
即我想要一個新的數據框,以藍色和綠色為列,值分別代表 A1+A2 和 A3&B1 的總和。 就像這里的一個:
result<-data.frame("Blue"=c(4,6,8), "Green"=c(9,11,13))
有很多關於基於條件的匯總列的帖子,但是經過一個上午的研究,我找不到任何可以解決我的確切問題的東西。
我們可以根據ref_df$code
值拆分df
的列,然后按行求和。
sapply(split.default(df, ref_df$code), rowSums)
# Blue Green
#[1,] 4 9
#[2,] 6 11
#[3,] 8 13
如果ref_df
的順序與df
列名的順序不同, ref_df
排列它們。
ref_df <- ref_df[match(ref_df$Name, names(df)),]
我們可以使用tidyverse
library(dplyr)
library(tidyr)
df %>%
mutate(rn = row_number()) %>%
pivot_longer(cols = -rn, names_to = 'Name') %>%
left_join(ref_df) %>%
group_by(code, rn) %>%
summarise(Sum = sum(value)) %>%
pivot_wider(names_from = code, values_from = Sum) %>% select(-rn)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.