我目前有一个类似于此的数据文件:
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
希望我以一种不让人困惑的方式正确地解释了这一点。
发布于 2020-04-21 05:41:49
我们可以使用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]
数据
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))
发布于 2020-04-21 20:29:46
我们也可以使用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))
https://stackoverflow.com/questions/61336598
复制相似问题