说我们有这个玩具示例:
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更好吗?
答案 0 :(得分:3)
如果要将表分为两个单独的列,则可以将表转换为列表
prueba[, as.list(table(is.na(.SD))), by=YEAR]
# YEAR FALSE TRUE
# 1: 1 7 2
# 2: 2 10 2
我建议不要将TRUE
和FALSE
用作列名。
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