【问题标题】:In data.table, How can I subset with ifelse() in j and use .N as the number of observations after the subset?在 data.table 中,如何使用 j 中的 ifelse() 进行子集化,并使用 .N 作为子集后的观察数?
【发布时间】:2020-05-14 13:13:08
【问题描述】:

我有一个数据表,我使用数据表的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,则该组由其总大小决定(很可能是因为我没有在 i.N 中设置子集)。

          x id newvari newvarj
 1: -1.2071  a      NA      NA
 2:  0.2774  a       3       5
 3:  1.0844  a       3       5
 4: -2.3457  a      NA      NA
 5:  0.4291  a       3       5
 6:  0.5061  b       1       5
 7: -0.5747  b      NA      NA
 8: -0.5466  b      NA      NA
 9: -0.5645  b      NA      NA
10: -0.8900  b      NA      NA

有没有办法在j 中使用ifelse() 语句来获取newvari?

编辑:我现在无法完全回忆起在j 中进行子集化的非常重要的原因。我只想说我的实际代码太乱了,我不想再把它拆开。 ;) 我希望这可能对其他人有用,作为一种选择。

【问题讨论】:

    标签: r if-statement data.table


    【解决方案1】:

    这是复制newvari 的一种方法。您可以使用ifelse(),但fifelse() 是它的data.table 版本。

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

    【讨论】:

    • 很有趣,谢谢!它不像 .N 那样灵活,对吧?像testdata[, newvarj := fifelse(x &gt; 0, 1:sum(x &gt; 0), NA_real_), by = id] 这样的东西在这里不起作用。你知道为什么吗?
    • @PeterPan 如果“是”比 ifelse 语句中的测试长,那是行不通的。
    猜你喜欢
    • 2021-07-03
    • 1970-01-01
    • 2020-07-24
    • 1970-01-01
    • 2018-12-07
    • 2021-07-23
    • 2018-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多