如何在特殊条件下合并2个数据帧[R]

时间:2015-07-17 07:53:28

标签: r dataframe

我有一个问题,解释很复杂,但我认为不难解决,但我是R的新手...所以希望你们能帮助我。

我有两个数据帧:

- 第一个包含Portfolio1的列。

- 第二列包含4列:日期,投资组合2,模拟,价值。

对于每一天,每个投资组合都有一个模拟,并获得一个值。

我想创建一个新表或数据框,其中我有这些模拟的值,一天(这不重要,因为输入数据只有一天)和每个投资组合。因此,该表将为每个投资组合提供一列,并为每个模拟提供一行。

值得一提的是,Portfolio1中将存在Portfolio2中不存在的值。我将在新表中添加一个0的列。

提前致谢!

P.S。我试图使用命令合并将它们合并失败。

输入数据将是这样的:

Portfolio1
Port1
Port2
Port3

Date          Portfolio2      Simulation     Value
20150715      Port1           Simul1         12.6
20150715      Port1           Simul2         13.6
20150715      Port1           Simul3         14.6
20150715      Port1           Simul4         15.6
20150715      Port1           Simul5         16.6
20150715      Port3           Simul1         12.7
20150715      Port3           Simul2         13.7
20150715      Port3           Simul3         14.7
20150715      Port3           Simul4         15.7
20150715      Port3           Simul5         16.7
20150715      Port4           Simul1         12.8
20150715      Port4           Simul2         13.8
20150715      Port4           Simul3         14.8
20150715      Port4           Simul4         15.8
20150715      Port4           Simul5         16.8

结果表:

        Port1   Port3   Port2
Simul1  12.6    12.7    0
Simul2  13.6    13.7    0
Simul3  14.6    14.7    0
Simul4  15.6    15.7    0
Simul5  16.6    16.7    0

问题是我不知道确切的列数。它将根据给定的输入文件确定。

1 个答案:

答案 0 :(得分:0)

我不确定我是否完全理解你的问题,但现在就去了。

要重新组织数据以使每个模拟行和每个组合的列都可以使用tidyr::spread,如下例所示:

> library(tidyr)
> df1 <- data.frame(x=c(1,2,3,1,2,3), p=c(1,1,1,2,2,2), v = c(111,222,333,444,555,666))
> spread(df1, p, v)
  x   1   2
1 1 111 444
2 2 222 555
3 3 333 666

为了获得缺失的投资组合,我现在想到的最好的是:

df2&lt; - setNames(expand.grid(unique(df1 $ x),c(1,2,3)),c(&#34; x&#34;,&#34; p&#34;) )

使用x列作为模拟ID,并使用c(1,2,3)作为所有可能的投资组合标识符。然后使用dplyr anti_join,您可以获得原始内容中没有出现的所有组合:

df3 <- anti_join(df2, df1, by = c("x", "p"))

将所需的值添加到此处:

df3$v <- 0

并将行添加到原始

> rbind(df1, df3)
  x p   v
1 1 1 111
2 2 1 222
3 3 1 333
4 1 2 444
5 2 2 555
6 3 2 666
7 3 3   0
8 2 3   0
9 1 3   0

可能最好忽略我答案的第二部分,这并不是很正确。我认为使用spread来重新组织data.frame是一个好主意。