【问题标题】:Matching the previous row in a specific column and performing a calculation in R匹配特定列中的前一行并在 R 中执行计算
【发布时间】:2020-04-21 05:34:19
【问题描述】:

我目前有一个类似这样的数据文件:

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

我想编写一个脚本,仅当“ID”匹配时才从前一行计算“(8-4)/(4-2)”。例如,在第 3 行中列“C”的输出中,如果“ID”列中的 A1 == A1,则 (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  

希望我以不混淆的方式正确解释了这一点。

【问题讨论】:

  • 你有多少列?

标签: r dplyr data.table


【解决方案1】:

我们可以group_byID,使用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]

数据

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))

【讨论】:

    【解决方案2】:

    我们也可以使用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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-27
      • 1970-01-01
      • 1970-01-01
      • 2012-06-22
      • 2022-01-20
      • 1970-01-01
      • 1970-01-01
      • 2020-08-11
      相关资源
      最近更新 更多