【问题标题】:How to crosstabulate the missings with data.table如何使用 data.table 对缺失值进行交叉制表
【发布时间】:2019-01-15 11:45:11
【问题描述】:

假设我们有这个玩具示例:

prueba <- data.table(aa=1:7,bb=c(1,2,NA, NA, 3,1,1),
cc=c(1,2,NA, NA, 3,1,1) , YEAR=c(1,1,1,2,2,2,2))

   aa bb cc YEAR
1:  1  1  1    1
2:  2  2  2    1
3:  3 NA NA    1
4:  4 NA NA    2
5:  5  3  3    2
6:  6  1  1    2
7:  7  1  1    2

我想创建一个包含 YEAR 值的表。 在这个简单的示例中,我将只询问我有多少丢失和未丢失的表格。

这是一种丑陋的做法,手动指定所有内容:

prueba[,.(sum(is.na(.SD)),sum(!is.na(.SD))), by=YEAR]

虽然它不会自动标记我们看到的新列,但它说我在第 1 年有 2 个缺失值和 7 个非缺失值,并且...

   YEAR V1 V2
1:    1  2  7
2:    2  2 10

它有效,但我真正想要的是能够使用 table() 或一些 data.table 等效命令,而不是手动指定每个术语。如果我有很多,或者我们事先不知道它们,那会更有效率。

我试过了:

prueba[,table(is.na(.SD)), by=YEAR]

但它不起作用,我明白了:

   YEAR V1
1:    1  7
2:    1  2
3:    2 10
4:    2  2

如何获得与上述相同的格式?
我不幸地尝试过使用 as.datable、unlist、lapply 和其他东西。我认为有些人使用 dcast,但我不知道如何在这里使用它。
有没有简单的方法来做到这一点? 我真正的桌子很大。 使用列名而不是 .SD 会更好吗?

【问题讨论】:

    标签: r data.table crosstab


    【解决方案1】:

    如果您希望将表格作为两个单独的列,您可以将其转换为列表

    prueba[, as.list(table(is.na(.SD))), by=YEAR]
    
    #    YEAR FALSE TRUE
    # 1:    1     7    2
    # 2:    2    10    2
    

    我建议不要使用TRUEFALSE 作为列名。

    prueba[, setNames(as.list(table(is.na(.SD))), c('notNA', 'isNA'))
           , by = YEAR]
    
    #    YEAR notNA isNA
    # 1:    1     7    2
    # 2:    2    10    2
    

    另一种选择是添加一个新列,然后添加dcast

    na_summ <- prueba[, table(is.na(.SD)), by = YEAR] 
    na_summ[, vname := c('notNA', 'isNA'), YEAR] 
    dcast(na_summ, YEAR ~ vname, value.var = 'V1')
    
    #    YEAR isNA notNA
    # 1:    1    2     7
    # 2:    2    2    10
    

    【讨论】:

    • 哦,是的,我尝试过取消列出。谢谢。我不知道为什么您的第一个解决方案比 prueba[,.(sum(is.na(.SD)),sum(!is.na(.SD))), by=YEAR] 慢十倍。如果没有“%>%”,您将如何进行第三个解决方案?
    • 我已将答案编辑为不使用%&gt;%。如果dcast 方法比我发布的第一个方法更快,我会感到惊讶。我猜data.table 在与组一起使用时具有sum 的内部优化,但对table 没有类似的优化,这会导致速度变慢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-20
    • 2015-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-28
    相关资源
    最近更新 更多