繁体   English   中英

在 R 中:如何从 1 个数据帧的第 i+1 行中获取值并从第二个数据帧的第 i+1 列中的每一行中减去

[英]in R: how to take value from i+1th row of 1 dataframe and subtract from every row in i+1th column of 2nd dataframe

请注意,实际数据集是 1000 列和 100 行,因此我正在寻找一种不需要手动命名列或行的方法。

使用具有类似结构的数据集如下:

subvalues <- c(1:10)

df <- data.frame(x = rpois(40,2), y = rpois(40,2), z = rpois(40,2), q = rpois(40,2), t = rpois(40,2))

调用子值行 SVa、SVb、SVc...
调用数据框列 Xa、Xb、Xc... Ya、Yb、Yc... 的行。

我要构建的是以下内容:首先获取subvalues (SVa) 的第一个单元格并从 X 列(Xa、Xb、Xc 等)中的每一行中减去它的函数,第二个获取subvalues的第二个单元格subvalues (SVb) 并从 y 列的每一行中减去它(Ya、Yb、Yc 等)

到目前为止我所拥有的是:

res <- numeric(length = length(x))  
for (i in seq_along(x)) {  
  res[i] <- xpos - [**SVi+1**] 
}  
res  

我需要弄清楚“SVi+1”循环以及如何在循环内正确执行循环。

任何帮助深表感谢

您提供的示例数据集将不起作用,因为您需要相同长度的subvaluesdf列数。

经过一些修改,这里是一个例子。 您不需要从子值中提取值,因为它只是一个减法。 请注意,我已将 df 保存在 tmp 中,以便在不丢失初始数据的情况下修改此 data.frame。 此外,如果整个 data.frame 是数字,请考虑使用矩阵,这可以节省您的时间。

subvalues <- c(1:5) # Note here the length 5 for the 5 columns of df.

df <- data.frame(x = rpois(40,2), y = rpois(40,2), z = rpois(40,2), q = rpois(40,2), t = rpois(40,2))
tmp <- df

for(i in seq_along(subvalues)){
  # print(subvalues[i]) 
  tmp[,i] <- tmp[,i] - subvalues[i]
}

tmp[,i]是一个向量,返回 data.frame 的i列,因此您可以将一个值减去向量,并将其保存在它的初始位置。

也许您可以尝试replicate以创建与df相同维度的矩阵,然后进行减法,即,

dfout <- df - t(replicate(nrow(df),subvalues))

以至于

> dfout
    x  y  z  q  t
1   0  1 -1  2 -4
2   0  0  0 -2 -1
3   1  1 -2 -2 -3
4   3  0 -2 -3 -2
5   0  0  0 -1 -1
6   3  1 -2 -2 -3
7   3 -2  0 -2 -5
8   1  0 -3 -3 -4
9   1  1 -2 -3 -2
10 -1  1 -2 -2 -4
11  0  0 -2 -2 -3
12  0  2 -3 -4 -2
13  2  0 -1 -4 -2
14  0 -1  1 -2 -4
15  2 -2  0  0 -4
16  1 -2  0 -2 -1
17  2 -1 -1 -2 -3
18  5  0 -1 -2 -2
19  0  0  0  2 -3
20  2  0 -1 -2 -1
21  3  2 -1 -1 -4
22  0 -1 -2 -2 -4
23  1  0 -2 -3 -1
24 -1 -1  3 -3 -3
25  0  0 -1 -1 -1
26  0 -1 -2 -2 -4
27 -1  0 -3 -3 -2
28  0  1 -1 -1 -2
29  3 -2  1 -4 -1
30  0  2 -1  0 -3
31  1 -1  2 -2 -2
32  1  1  0 -2 -4
33  1 -1 -2 -3 -5
34  0 -1 -1 -2 -1
35  2  0 -2 -2 -4
36  1  2 -3 -3 -3
37  2  2  0 -2 -5
38 -1 -1 -3 -4 -2
39  2  1 -1 -3 -4
40  1  3 -1 -3 -2

数据

set.seed(1)
subvalues <- c(1:5) # Note here the length 5 for the 5 columns of df.

df <- data.frame(x = rpois(40,2), y = rpois(40,2), z = rpois(40,2), q = rpois(40,2), t = rpois(40,2))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM