按列处理每行分组

时间:2018-02-21 00:45:39

标签: r

我正在尝试处理在A列中具有相同元素的分组,在下面的示例中,它将从0,1和2创建3个组。如果分组的值为“E”,则使用从该行开始的C列中的值,通过从分组中的C列中的其他值中减去它,在每隔一行中创建一个新列“D”。

  A   B   C
------------------
  0   E   2
  0   F   4
  0   G   8
  1   E   10
  1   H   4
  2   J   3

变为:

  A   B   C   D
------------------
  0   E   2   NA    # Don't subtract from self
  0   F   4   2     # (4 - 2)
  0   G   8   6     # (8 - 2) 
  1   E   10  NA    # Don't subtract from self
  1   H   4   -6    # (4 - 10)
  2   J   3   NA    # no row with matching Column A and Column B == "E"

因此,对于列A等于0的行,它会将列C减去2,因为列B等于“E”或列C为2.行A等于2的行不会有值为该分组中没有行的列B等于“E”。

2 个答案:

答案 0 :(得分:0)

 dat%>%group_by(A)%>%
     mutate(D=ifelse(length(C[B=="E"])>0,C[B=="E"],NA),
            D=replace(C-D,B=="E",NA))
# A tibble: 6 x 4
# Groups:   A [3]
      A     B     C     D
  <int> <chr> <int> <int>
1     0     E     2    NA
2     0     F     4     2
3     0     G     8     6
4     1     E    10    NA
5     1     H     4    -6
6     2     J     3    NA

这可以写成:

dat%>%group_by(A)%>%mutate(D=ifelse(length(a<-C[B=="E"])>0,a,NA),D=C-`is.na<-`(D,B=="E"))

答案 1 :(得分:0)

使用dat[, D := C - C[B == "E"], by=A][B == "E", D := NA][] # A B C D #1: 0 E 2 NA #2: 0 F 4 2 #3: 0 G 8 6 #4: 1 E 10 NA #5: 1 H 4 -6 #6: 2 J 3 NA ,它非常简单:

dat

library(data.table) dat <- read.table(text=" A B C 0 E 2 0 F 4 0 G 8 1 E 10 1 H 4 2 J 3", header=TRUE) setDT(dat) 的位置:

status.json