我的数据如下:
ID CO MV
1 0 1
1 5 0
1 0 1
1 9 0
1 8 0
1 0 1
2 69 0
2 0 1
2 8 0
2 0 1
2 78 0
2 53 0
2 0 1
2 3 0
3 54 0
3 0 1
3 8 0
3 90 0
3 0 1
3 56 0
4 0 1
4 56 0
4 0 1
4 45 0
4 0 1
4 34 0
4 31 0
4 0 1
4 45 0
5 0 1
5 0 1
5 67 0
我希望它看起来像这样:
ID CO MV CONUM
1 0 1 3
1 5 0 3
1 0 1 3
1 9 0 3
1 8 0 3
1 0 1 3
2 69 0 5
2 0 1 5
2 8 0 5
2 0 1 5
2 78 0 5
2 53 0 5
2 0 1 5
2 3 0 5
3 54 0 4
3 0 1 4
3 8 0 4
3 90 0 4
3 0 1 4
3 56 0 4
4 0 1 5
4 56 0 5
4 0 1 5
4 45 0 5
4 0 1 5
4 34 0 5
4 31 0 5
4 0 1 5
4 45 0 5
5 0 1 1
5 0 1 1
5 67 0 1
我想创建一个列CONUM,它是ID列中每个值的CO列中除零之外的值的总数。因此,例如ID 1的CO列有3个非零值,因此CONUM列中的相应值为3.如果CO列具有值,则MV列为0,如果CO列为0,则MV列为1.因此,另一种方法是完成创建CONUM列将计算每个ID的零数。如果你可以帮我用r代码来实现这个目标会很棒。感谢。
答案 0 :(得分:5)
以下是data.table
library(data.table)
setDT(df)[,CONUM:=sum(CO!=0) ,ID][]
答案 1 :(得分:3)
以及dplyr
# install.packages("dplyr")
library(dplyr)
dat <- dat %>%
group_by(ID) %>%
mutate(CONUM = sum(CO != 0))
答案 2 :(得分:3)
您可以在基础R中使用ave
:
dat <- transform(dat, CONUM = ave(as.logical(CO), ID, FUN = sum))