Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 有条件计数但无NA_R_Count_Data.table - Fatal编程技术网

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