我有两个具有220个obs和80个变量的数据框。第一个数据帧df1
仅具有数据点1
,2
和3
。第二个数据帧df2
具有由小数组成的不同数值,例如0.12
,-0.03
,0.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个变量的矩阵。请注意,df1
和df2
具有相同的列名,并且顺序相同。如何通过对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中使用嵌套的IF
,AND
和OR
函数可以轻松完成此操作,但是我不知道如何在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