R 在data.table中,如何在j中使用ifelse()进行子集,并在子集后使用.N作为观察数?

R 在data.table中,如何在j中使用ifelse()进行子集,并在子集后使用.N作为观察数?,r,if-statement,data.table,R,If Statement,Data.table,我有一个数据表,其中我使用数据表的j部分的ifelse()命令生成子集。我想计算这个子集内的观察数(而不是整个组的观察数)。如果我使用了I部件,则没有问题: library("data.table") set.seed(1234) testdata <- data.table(x= rnorm(10), id= rep(c("a","b"), each =5)) testdata[x > 0, newvari := .N, by= id]

我有一个数据表,其中我使用数据表的
j
部分的
ifelse()
命令生成子集。我想计算这个子集内的观察数(而不是整个组的观察数)。如果我使用了
I
部件,则没有问题:

library("data.table")
set.seed(1234)
testdata <- data.table(x= rnorm(10),
                   id= rep(c("a","b"), each =5))


testdata[x > 0, newvari := .N, by= id] 
testdata

          x id newvari
 1: -1.2071  a      NA
 2:  0.2774  a       3
 3:  1.0844  a       3
 4: -2.3457  a      NA
 5:  0.4291  a       3
 6:  0.5061  b       1
 7: -0.5747  b      NA
 8: -0.5466  b      NA
 9: -0.5645  b      NA
10: -0.8900  b      NA
是否有办法使用
j
中的
ifelse()
语句获取新变量


编辑:对于我来说,在
j
中加入子集有非常重要的原因,我现在无法准确地回忆起来。我只想说,我的实际代码太乱了,我不想再把它拆开我希望这对将来的其他人也有用,只是作为一种选择。

这里有一种复制
newvari
的方法。您可以使用
ifelse()
,但是
fielse()
是它的
数据。表
版本

testdata[, newvarj := fifelse(x > 0, sum(x > 0), NA_real_), by = id]

下面是一种复制
newvari
的方法。您可以使用
ifelse()
,但是
fielse()
是它的
数据。表
版本

testdata[, newvarj := fifelse(x > 0, sum(x > 0), NA_real_), by = id]

很有趣,谢谢!但它没有.N那么灵活,对吗?像
testdata[,newvarj:=fifelse(x>0,1:sum(x>0),NA\u real\ux),by=id]这样的东西在这里不起作用。你知道为什么吗?@PeterPan如果在ifelse语句中有一个比测试长的“是”,那是行不通的。很有趣,谢谢!但它没有.N那么灵活,对吗?像
testdata[,newvarj:=fifelse(x>0,1:sum(x>0),NA\u real\ux),by=id]这样的东西在这里不起作用。你知道为什么吗?@PeterPan如果有比ifelse语句中的测试长的“Yes”是行不通的。