в R: как взять значение из i + 1-й строки 1-го кадра данных и вычесть из каждой строки в i + 1-м столбце 2-го кадра данных - PullRequest
0 голосов
/ 15 января 2020

Обратите внимание, что фактический набор данных состоит из 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, SV c ...
вызывать строки столбцов данных Xa, Xb, X c ... Ya, Yb, Y c ... et c.

Я пытаюсь построить следующее: функция, которая берет первую первую ячейку subvalues (SVa) и вычитает ее из каждой строка в столбце X (Xa, Xb, X c, et c.), 2-ая, чтобы взять вторую ячейку subvalues (SVb) и вычесть ее из каждой строки в столбце y (Ya, Yb, Y c, et c.)

То, что у меня пока есть:

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

Мне нужно выяснить 'SVi + 1' l oop и как правильно сделать l oop -все oop.

Любая помощь очень ценится

Ответы [ 2 ]

0 голосов
/ 15 января 2020

Может быть, вы можете попытаться 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))

0 голосов
/ 15 января 2020

Предоставленный вами пример набора данных не будет работать, потому что вам нужна одинаковая длина для subvalues и количество столбцов df.

После некоторых модификаций, вот пример. Вам не нужно извлекать значение из подзначений, так как это просто вычитание. Обратите внимание, что я сохранил df в tmp, чтобы изменить этот data.frame без потери ваших начальных данных. Кроме того, если весь data.frame имеет число c, рассмотрите возможность использования матрицы, которая может сэкономить ваше время.

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] - это вектор, возвращающий столбец i в data.frame. и, таким образом, вы можете вычесть значение в вектор и сохранить его в исходном месте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...