计算不同行和不同列

时间:2018-02-15 08:08:09

标签: r dataframe dplyr data.table plyr

我有一个这样的数据框:

ID  s1  e1  s2  e2
A   50  150 80  180
A   160 350 280 470
A   355 700 800 1150
B   100 500 150 550
B   550 1500    800 1750

当ID相同时,我想计算连续行但不同列的值之间的差异(对于ID A:第2行中的s1减去第1行中的e1;第3行中的s1减去第2行中的e1;第2行中的s2减去第2行中的e2) row1; row3中的s2减去row2中的e2)并将这些值添加到新列(diff1和diff2)。

数据框看起来像这样:

ID  s1  e1  s2  e2  diff1   diff2
A   50  150 80  180     
A   160 350 280 470 10  100
A   355 700 800 1150    5   330
B   100 500 150 550     
B   550 1500    800 1750    50  250

这可能吗?

提前谢谢

WD

1 个答案:

答案 0 :(得分:2)

按ID'分组后,获取' s1'的lead,从' e1'中删除它,然后创建' DIFF1'作为此输出的lag。同样,' diff2'可以创建相应的对's2'和' e2'列

library(dplyr)
df1 %>%
    group_by(ID) %>%
    mutate(diff1 = lag(lead(s1) - e1), diff2 = lag(lead(s2)- e2))
# A tibble: 5 x 7
# Groups: ID [2]
#   ID       s1    e1    s2    e2 diff1 diff2
#   <chr> <int> <int> <int> <int> <int> <int>
#1 A        50   150    80   180    NA    NA
#2 A       160   350   280   470    10   100
#3 A       355   700   800  1150     5   330
#4 B       100   500   150   550    NA    NA
#5 B       550  1500   800  1750    50   250

如果有多个&#39;,&#39; e&#39;成对,data.table的一个选项是melt它长到&#39;格式,然后dcast到&#39;宽&#39;在做了必要的计算之后

library(data.table)
dnew <- dcast(melt(setDT(df1, keep.rownames = TRUE),
 measure = patterns("^s\\d+", "^e\\d+"), value.name = c("s", "e"))[, 
  diffs := shift(shift(s, type = "lead") - e), .(ID, variable)][],
           rn + ID ~ paste0('diff', variable), value.var = 'diffs')
df1[, names(dnew)[3:4] := dnew[, 3:4, with = FALSE]][, rn := NULL][]
#   ID  s1   e1  s2   e2 diff1 diff2
#1:  A  50  150  80  180    NA    NA
#2:  A 160  350 280  470    10   100
#3:  A 355  700 800 1150     5   330
#4:  B 100  500 150  550    NA    NA
#5:  B 550 1500 800 1750    50   250