Сопоставление предыдущей строки в указанном столбце c и вычисление в R - PullRequest
4 голосов
/ 21 апреля 2020

У меня сейчас есть файл данных, похожий на этот:

R ID A B    
1 A1 0 0  
2 A1 2 4  
3 A1 4 8    
4 A2 0 0  
5 A2 3 3  
6 A2 6 6

Я хотел бы написать скрипт, который будет вычислять только "(8-4) / (4-2)" из предыдущей строки только если «ID» совпадает. Например, в выходных данных для столбца "C" в строке 3, если A1 == A1 в столбце "ID", то (8-4) / (4-2) = 2. Если A1! = A1 затем вывод равен 0.

Мне бы хотелось, чтобы вывод был таким:

R ID A B C   
1 A1 0 0 0  
2 A1 2 4 2  
3 A1 4 8 2     
4 A2 0 0 0  
5 A2 3 3 1   
6 A2 6 6 1  

Надеюсь, я объяснил это правильно, не путая.

Ответы [ 2 ]

3 голосов
/ 21 апреля 2020

Мы могли бы group_by ID, использовать diff для вычисления разницы между строками и деления.

library(dplyr)
df %>% group_by(ID) %>% mutate(C = c(0, diff(B)/diff(A)))

#      R ID        A     B     C
#  <int> <fct> <int> <int> <dbl>
#1     1 A1        0     0     0
#2     2 A1        2     4     2
#3     3 A1        4     8     2
#4     4 A2        0     0     0
#5     5 A2        3     3     1
#6     6 A2        6     6     1

и аналогично с использованием data.table

library(data.table)
setDT(df)[, C := c(0, diff(B)/diff(A)), ID]

data

df <- structure(list(R = 1:6, ID = structure(c(1L, 1L, 1L, 2L, 2L, 
2L), .Label = c("A1", "A2"), class = "factor"), A = c(0L, 2L, 
4L, 0L, 3L, 6L), B = c(0L, 4L, 8L, 0L, 3L, 6L)), class = "data.frame", 
row.names = c(NA, -6L))
1 голос
/ 21 апреля 2020

Мы также можем использовать lag

library(dplyr)
df %>% 
   group_by(ID) %>% 
   mutate(C = (B - lag(B, default = first(B)))/(A - lag(A, default = first(A))))

данные

df <- structure(list(R = 1:6, ID = structure(c(1L, 1L, 1L, 2L, 2L, 
2L), .Label = c("A1", "A2"), class = "factor"), A = c(0L, 2L, 
4L, 0L, 3L, 6L), B = c(0L, 4L, 8L, 0L, 3L, 6L)), class = "data.frame", 
row.names = c(NA, -6L))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...