如果数据符合来自R中另一个数据帧的条件,则从数据帧中对数据进行求和

时间:2018-05-20 18:11:50

标签: r if-statement dataframe sum rows

我有两个数据框,包含220个obs和80个变量。第一个数据框df1仅包含数据点123。第二个数据框df2具有由小数组成的不同数值,例如0.12-0.030.01等。(应该描绘市值加权股票收益率一个月)。 PS:原始数据集的长度为80。

例如

df1 = data.frame(a = c(2, 2, 1), b = c(3, 2, 3), c = c(1, 1, 2), d = c(3, 3, 1))

  a b c d
1 2 3 1 3
2 2 2 1 3
3 1 3 2 1

df2 = data.frame(a = c(0.1, 0.1, 0.2), b = c(0.3, 0.4, 0.6), c = c(0.2, 0.3, 0.5), d = c(0.1, 0.5, 0.6))

    a   b   c   d
1 0.1 0.3 0.2 0.1
2 0.1 0.4 0.3 0.5
3 0.2 0.6 0.5 0.6

如何根据df2中的值,将df1的行相加并转换为包含220个obs和3个变量的矩阵。请注意,df1df2具有相同顺序的列名。如何通过汇总df3的行,根据df1中的指标变量创建第三个数据框df2?我想根据df2中的值来汇总df1行,以创建df3

df3 =
   X1  X2  X3
1 0.2 0.1 0.4
2 0.3 0.5 0.5
3 0.8 0.5 0.6

我们先来看(X1,1)1中的行df1仅包含一个值为1的数据点,即(c,1)。因此,我们将1的行df2求和以获得0.2。现在查看(X1,3)(列X1的最后一个值)。观察3中的行df1,找到值为1的两个数据点。在df2中,这两个值为0.2 (a,3)0.6 (d,3),并将这些值相加得到0.8

以下是对df3的看法的解释:

calculation = data.frame("1" = c("0+0+0.2+0", "0+0+0.3+0", "0.2+0+0+0.6"), "2" = c("0.1+0+0+0", "0.1+0.4+0+0", "0+0+0.5+0"), "3" = c("0+0.3+0+0.1", "0+0+0+0.5", "0+0.6+0+0"))

                 X1                X2                X3
1   0 + 0 + 0.2 + 0   0.1 + 0 + 0 + 0 0 + 0.3 + 0 + 0.1
2   0 + 0 + 0.3 + 0 0.1 + 0.4 + 0 + 0   0 + 0 + 0 + 0.5
3 0.2 + 0 + 0 + 0.6   0 + 0 + 0.5 + 0   0 + 0.6 + 0 + 0

基于股票的更实际的解释。假设df1是一个描述买入,持有和卖出建议的矩阵。 df2描述了市场加权股票收益率。所有变量/列都是不同的股票。 df3创建一个包含三个不同投资组合的矩阵。如果股票是“买入”,我想把它放在“买入”投资组合中。如果股票是“持有”,我想把它放在“持有”投资组合等中。这可以通过嵌套的IFANDOR函数在Excel中轻松完成,但是我不知道如何在R中做到这一点。

2 个答案:

答案 0 :(得分:3)

我们可以通过将数据集转换为tapply来使用matrix,使用分组变量作为数据的row索引和' df1'

tapply(as.matrix(df2), list(row(df2), as.matrix(df1)), FUN = sum)
#       1   2   3
#[1,] 0.2 0.1 0.4
#[2,] 0.3 0.5 0.5
#[3,] 0.8 0.5 0.6

或者使用tidyverse,将gather两者之后的数据集绑定到' long'数据,然后按sum

进行分组
library(tidyverse)
gather(df1) %>%
    bind_cols(gather(df2)) %>% 
    group_by(key) %>%
    group_by(rn = row_number(), value) %>% 
    summarise(value1 = sum(value1)) %>% 
    spread(value, value1) %>% 
    ungroup %>% 
    select(-rn)
# A tibble: 3 x 3
#    `1`   `2`   `3`
#  <dbl> <dbl> <dbl>
#1   0.2   0.1   0.4
#2   0.3   0.5   0.5
#3   0.8   0.5   0.6

答案 1 :(得分:2)

这是另一个基本R方法,它使用rowsum执行组合并并使用mapply遍历行。

t(mapply(rowsum, as.data.frame(t(df2)), as.data.frame(t(df1))))
   [,1] [,2] [,3]
V1  0.2  0.1  0.4
V2  0.3  0.5  0.5
V3  0.8  0.5  0.6

请注意,我使用的是R 3.4.4。我相信R 3.5.0+不需要as.data.frame,因为t在输入data.frame时应返回data.frame。