我有两个具有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 ob​​s和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用三个不同的投资组合创建一个矩阵。如果股票是“买入”,我想将其放入“买入”投资组合中。如果股票为“持有”,我想将其放入“持有”投资组合中,依此类推。在Excel中使用嵌套的IFANDOR函数可以轻松完成此操作,但是我不知道如何在R中执行此操作。

最佳答案

我们可以通过将数据集转换为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之后将数据集绑定为“长”数据,然后按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

10-04 23:20
查看更多