对来自行名匹配的两个数据帧的数据求和
Sum data from two data frames matched by rowname
我有两个行数不同的数据框,因此:
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 添加第二列 "Result"。此列将 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 对象会更容易,尽管我通常发现数据帧更容易使用。
你可以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)
我们可以使用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
我有两个行数不同的数据框,因此:
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 添加第二列 "Result"。此列将 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 对象会更容易,尽管我通常发现数据帧更容易使用。
你可以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)
我们可以使用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