如何使用data.table

时间:2019-01-15 11:45:12

标签: r data.table crosstab

说我们有这个玩具示例:

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]

尽管它不会自动标记新列,但我们看到它说我在第一年有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更好吗?

1 个答案:

答案 0 :(得分:3)

如果要将表分为两个单独的列,则可以将表转换为列表

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