我正在尝试处理在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”。
答案 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