Сумма столбцов на основе индекса в другом фрейме данных в R - PullRequest
0 голосов
/ 03 февраля 2020

У меня есть два фрейма данных, подобных этому:

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"))

Я хотел бы суммировать значения в столбцах df на основе кода в ref_df. Я хотел бы сохранить результаты в новом фрейме данных с именами столбцов, совпадающими с кодом в ref_df

, т. Е. Я хотел бы новый фрейм данных с Blue и Green в качестве столбцов и значения, представляющие сумму A1 + А2 и А3 и В1 соответственно. Например, здесь:

result<-data.frame("Blue"=c(4,6,8), "Green"=c(9,11,13))

На столбцах суммирования, основанных на условиях, много постов, но после утреннего исследования я не могу найти ничего, что решило бы мою точную проблему.

Ответы [ 2 ]

1 голос
/ 03 февраля 2020

Мы можем разделить столбцы в df на основе значений в ref_df$code, а затем взять строчную сумму.

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[match(ref_df$Name, names(df)),]
0 голосов
/ 03 февраля 2020

Мы можем использовать 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...