Я должен добавить два фрейма данных и вычислить сумму для каждого идентификатора учетной записи

#r

#r

Вопрос:

df1

 acc_id || s1_2005 || s1_2006
87         1       1
  

df2

 acc_id || s2_2005 || s2_2006
87            2       3
  

вывод

df3

 acc_id ||s1_2005   s2_2005 || s1_2006   s2_2006
87                3                   4
  

Комментарии:

1. Спасибо за информацию. Я буду иметь это в виду.

Ответ №1:

Для этого есть несколько способов. Один из способов — использовать rbind() для объединения данных в один фрейм данных, а затем для aggregate() передачи данных на уровень acc_id.

 # example data
df1 <- data.frame(
    acc_id = c(87, 88),
    s1_2005 = c(1, 2),
    s1_2006 = c(1, 2))

df2 <- data.frame(
    acc_id = c(87, 89),
    s1_2005 = c(2, 4),
    s1_2006 = c(3, 4))

# combine data by stacking
df <- rbind(df1, df2)

# sum s1_2005 and s1_2006 by acc_id
res <- aggregate(df[ , c("s1_2005", "s1_2006")], by=df["acc_id"], FUN=sum)

# print result
res
  

Результат:

   acc_id s1_2005 s1_2006
      87       3       4
      88       2       2
      89       4       4
  

Комментарии:

1. Спасибо за ваш ответ, но мне нужно добавить s1_2005 и s2_2005 для каждого account_id.

2. Это именно то, что делает мой код. Я использовал 3 идентификатора учетной записи (87, 88 и 89), чтобы вы могли видеть, как данные для идентификатора 87 складываются вместе.

Ответ №2:

Используя dplyr

 library(dplyr)
bind_rows(df1, df2) %>% 
    group_by(acc_id) %>% 
    summarise(across(everything(), sum), .groups = 'drop')
  

-вывод

 # A tibble: 3 x 3
#  acc_id s1_2005 s1_2006
#   <dbl>   <dbl>   <dbl>
#1     87       3       4
#2     88       2       2
#3     89       4       4
  

данные

 df1 <- data.frame(
    acc_id = c(87, 88),
    s1_2005 = c(1, 2),
    s1_2006 = c(1, 2))

df2 <- data.frame(
    acc_id = c(87, 89),
    s1_2005 = c(2, 4),
    s1_2006 = c(3, 4))
  

Комментарии:

1. Большое вам спасибо