簡體   English   中英

根據 R 中不同數據框中的索引對列求和

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM