[英]How to take value from i+1th column of 1 df and calculate distance to values in every row in i+1th column of 2nd df
[英]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”循环以及如何在循环内正确执行循环。
任何帮助深表感谢
您提供的示例数据集将不起作用,因为您需要相同长度的subvalues
和df
列数。
经过一些修改,这里是一个例子。 您不需要从子值中提取值,因为它只是一个减法。 请注意,我已将 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.