从一个数据框中减去另一个数据框中的一行价格

时间:2014-11-03 15:07:15

标签: r sorting dataframe subtraction

我有一个包含163列唯一名称的数据框,比如说(x1,x2,x3,x4 ....),这些列中的每一列都有一系列回报(0.248,-0.00384等)。

**DF1**
 x1       x2      x3     x4    .....
0.248 -0.00384  0.0394 0.0053  .....

在另一个数据框中,我有一个列,列有相同的唯一名称(x1,x2,x3,x4 ......),另一列有一个数字列表(0.005,.001等)。

**DF2**
x1 0.005
x2 0.001 
x3 0.005
x4 0.0005
...

我的最终目标是返回一个包含163列(x1,x2等)的数据帧,每列净返回(因此x1列是原始返回减去0.005,x2列是原始返回减去0.001,等)。

到目前为止,我尝试对第二个数据帧进行排序,转置并使用unlist来获取数字向量,然后我可以从每列中减去(但我无法弄清楚如何从每列中减去)。任何帮助找出如何做到这一点将是非常有帮助的。第二个数据框中的唯一名称列表与第一个数据帧相同,第一个数据帧也按字母顺序排序,因此不需要匹配(两个排序都将排成一行)。

1 个答案:

答案 0 :(得分:1)

如果DF1的同名和DF2的rownames的顺序不同,您可以使用match

 DF1-DF2[match(colnames(DF1), rownames(DF2)),1][col(DF1)]

如果其中一个或两个数据集的顺序不同,则应该有效。例如

 set.seed(65)
 DF1N <- DF1[,sample(colnames(DF1))]

 DF1N-DF2[match(colnames(DF1N), rownames(DF2)),1][col(DF1N)]

如果他们按顺序

 DF1-DF2[,1][col(DF1)]

数据

set.seed(24)
DF1 <- as.data.frame(matrix(rnorm(40*10), ncol=10,
             dimnames=list(NULL, paste0("x", 1:10))) )
set.seed(42)
DF2 <- data.frame(Col1=rnorm(10, 0.01))
row.names(DF2) <- sample(paste0("x",1:10))