Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将一个数据帧中的一行价格从另一个数据帧中的列中减去_R_Sorting_Dataframe_Subtraction - Fatal编程技术网

R 将一个数据帧中的一行价格从另一个数据帧中的列中减去

R 将一个数据帧中的一行价格从另一个数据帧中的列中减去,r,sorting,dataframe,subtraction,R,Sorting,Dataframe,Subtraction,我有一个数据帧,其中有163列具有唯一的名称,比如(x1、x2、x3、x4……)这些列中的每一列都有一系列的返回(0.248、-0.00384等) 在另一个数据帧中,我有一列具有相同唯一名称的列表(x1、x2、x3、x4…),另一列具有数字列表(0.005、001等) 我的最终目标是返回一个包含163列(x1、x2等)的数据帧,每列净返回(因此x1列是原始返回减去0.005,x2列是原始返回减去0.001,等等) 到目前为止,我尝试了对第二个数据帧进行排序、转置和使用unlist得到一个数字向量

我有一个数据帧,其中有163列具有唯一的名称,比如(x1、x2、x3、x4……)这些列中的每一列都有一系列的返回(0.248、-0.00384等)

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

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


到目前为止,我尝试了对第二个数据帧进行排序、转置和使用unlist得到一个数字向量,然后我可以从每列中减去它(但我不知道如何从每列中减去)。任何关于如何做到这一点的帮助都会非常有用。第二个数据帧中的唯一名称列表与第一个数据帧中的唯一名称列表相同,也按字母顺序排序,因此不需要对其进行匹配(两个排序将对齐)。

如果
DF1
的列名和
DF2
的行名顺序不相同,则可以使用
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)]
数据
set.seed(24)

DF1这些是按相同的顺序排列的吗?是的,一旦排序,它们就按相同的顺序排列。只是想弄清楚如何从DF1的整个第一列中减去DF2的第一个价格,从DF1的整个第二列中减去DF2的第二个价格,等等。太棒了,非常感谢。很明显,我在考虑这个问题,match函数工作得很好,但没有意识到它可以将向量作为行号返回到括号中。“这真是一个很有帮助的教训。”特雷弗·内德勒说,没问题。我用
[col(DF1)]
来复制
DF2[,1]
的每个值,这样就可以进行元素间的减法,否则我们就必须依赖于循环。啊,是的,当我测试它时,我正要说,因为它循环了向量,所以对某些值使用了错误的价格(这样设置将从DF1的整个列中获取每个价格)。再次感谢,这是一个非常好的解决方案。
 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))