R 有条件计数但无NA
我有一个这样的数据框R 有条件计数但无NA,r,count,data.table,R,Count,Data.table,我有一个这样的数据框 library(data.table) mydata<- data.table(comname=c("hon","hon","hon","acer","acer","acer","acer","acer","acer"), oversea=c(1,0,1,1,0,1,1,1,0), year=c(1991,1992,1993,1981,1982,1983,1983,1984,1985), hopecount=c(0,0,1,0,0,1,1,2,2)) comn
library(data.table)
mydata<-
data.table(comname=c("hon","hon","hon","acer","acer","acer","acer","acer","acer"),
oversea=c(1,0,1,1,0,1,1,1,0),
year=c(1991,1992,1993,1981,1982,1983,1983,1984,1985),
hopecount=c(0,0,1,0,0,1,1,2,2))
comname oversea year hopecount
1: hon 1 1991 0
2: hon 0 1992 0
3: hon 1 1993 1
4: acer 1 1981 0
5: acer 0 1982 0
6: acer 1 1983 1
7: acer 1 1983 1
8: acer 1 1984 2
9: acer 0 1985 2
我希望得到mycount=hopecount,但当海外==0时,mycount将为NA
有没有办法让Overseas==0“不计数”并填写“上一次计数时间”而不是“NA”。
就像hopecount的形式一样
我们可以使用
zoo
中的na.locf
将na元素替换为先前的非na相邻元素
library(data.table)
library(zoo)
mydata[oversea==1, hopecount2 := match(year, unique(year))-1, comname
][, hopecount2 := na.locf(hopecount2), comname]
identical(mydata$hopecount, mydata$hopecount2)
#[1] TRUE
或者
mydata[,v:=cumsum(海外)-1,by=comname][]
。哦,nvm,OP的编辑打破了这一点。@Frank,我相信计数也与OP上一篇文章中的年份栏有关question@docendo是的,我的建议恰好适用于OP的初始示例,因为编辑了so year MATERS。扩展我对您上一个问题的回答,您可以使用mydata[,mycount:=cumsum(!duplicated(year)&overseas==1)-1L,by=comname]
您正在(comname,year)级别定义变量。在我看来,最好在该级别创建一个表,比如comnear=unique(mydata[overseas==1,(comname,year)][,v:=rowid(comname)-1L][]
或其他什么,在需要之前不要麻烦将变量合并回mydata
。@docendoscimus,我可以问一下“-1L”的功能吗?一次延迟?或其他什么。thx@changix-1L
表示1的简单减法(作为整数)。1
是双精度的,1L
是整数。
library(data.table)
library(zoo)
mydata[oversea==1, hopecount2 := match(year, unique(year))-1, comname
][, hopecount2 := na.locf(hopecount2), comname]
identical(mydata$hopecount, mydata$hopecount2)
#[1] TRUE