Суммировать данные из двух фреймов данных, сопоставленных по имени строки - PullRequest
3 голосов
/ 10 октября 2019

У меня есть два фрейма данных с различным количеством строк, таким образом:

df1:
           Data1
2019-03-01 0.011
2019-04-01 0.021
2019-05-01 0.013
2019-06-01 0.032
2019-07-01 NA

df2:
           Data2
2019-01-01 0.012
2019-02-01 0.024
2019-03-01 0.033
2019-04-01 0.017
2019-05-01 0.055
2019-06-01 0.032
2019-07-01 0.029

Имена строк - это даты. Я хочу добавить второй столбец "Результат" к df1. Этот столбец будет суммировать значение в df1 $ Data1 + значение в строке df2 $ Data2 с тем же именем строки. (Имена строк в обоих фреймах данных уникальны и упорядочены.) Так, например:

df1$Result[1] <- df1$Data1[1] + df2$Data2[3]

В результате получится:

df1:
           Data1 Result
2019-03-01 0.011 0.044
2019-04-01 0.021 0.038
2019-05-01 0.013 0.068
2019-06-01 0.032 0.064
2019-07-01 NA    NA

Единственный способ выяснить, каксделать это с помощью циклической конструкции, но я должен думать, что есть лучший способ. Я не нахожу это, тем не менее, поэтому я предполагаю, что я ищу не ту вещь. Любые идеи?

Я также открыт для других предложений для достижения той же цели. Так, например, если это будет проще сделать с датами в столбце данных, а не в имени строки, это будет хорошо. Или, если это было бы проще сделать с объектом ts, хотя я обычно нахожу, что с фреймами данных легче работать.

Ответы [ 2 ]

2 голосов
/ 10 октября 2019

Вы можете merge два кадра данных по именам строк, а затем добавить соответствующие столбцы

transform(merge(df1, df2, by = 0), sum = Data1 + Data2)


#   Row.names Data1 Data2   sum
#1 2019-03-01 0.011 0.033 0.044
#2 2019-04-01 0.021 0.017 0.038
#3 2019-05-01 0.013 0.055 0.068
#4 2019-06-01 0.032 0.032 0.064
#5 2019-07-01    NA 0.029    NA

Или аналогично dplyr

library(dplyr)
library(tibble)

inner_join(df1 %>% rownames_to_column(), 
           df2 %>% rownames_to_column(), by = "rowname") %>%
mutate(Result = Data1 + Data2)
1 голос
/ 10 октября 2019

Мы можем использовать data.table

library(data.table)
setDT(df1, keep.rownames = TRUE)
setDT(df2, keep.rownames = TRUE)
df2[df1, on = .(rn)][, sum := Data1 + Data2][]
#           rn Data2 Data1   sum
#1: 2019-03-01 0.033 0.011 0.044
#2: 2019-04-01 0.017 0.021 0.038
#3: 2019-05-01 0.055 0.013 0.068
#4: 2019-06-01 0.032 0.032 0.064
#5: 2019-07-01 0.029    NA    NA
...