如何分组并通过两个变量计数,并“扩展”第二个变量,全部在data.table中

时间:2018-05-28 16:27:48

标签: r data.table

我在不同地点有数年的数据。我希望按地点按年计算:

library(data.table)
t1 <- data.table(ID = 1:100, Year = 2010:2015, Loc = LETTERS[1:7])
t1 <- t1[, .N, by=.(Year, Loc)]

#    Year Type N
# 1: 2010    A 3
# 2: 2011    B 3
# 3: 2012    C 3
# ...

但是,我想要的是一个data.table解决方案,类似于下面的使用dplyr:

library(dplyr)
spread(t1, Loc, N)

#    Year A B C D E F G
# 1: 2010 3 2 2 2 2 3 3
# ...

如何使用data.table执行此操作?我有大约100个变量的数百万行,其中很多都有数千个因子级别,我宁愿坚持使用data.table。我尝试了其他逐组变量问题的一些解决方案,但是他们都抛出了错误.N不是函数吗?我错过了一些非常明显的东西吗

1 个答案:

答案 0 :(得分:1)

可以使用data.table::dcast来传播数据。在OP使用的示例中,可以将dcast添加为:

dcast(t1, Year ~ Loc, value.var = "N")

#    Year A B C D E F G
# 1: 2010 3 2 2 2 2 3 3
# 2: 2011 3 3 2 2 2 2 3
# 3: 2012 3 3 3 2 2 2 2
# 4: 2013 2 3 3 3 2 2 2
# 5: 2014 2 2 2 3 3 2 2
# 6: 2015 2 2 2 2 3 3 2

即使是OP所示的第二个中间步骤也不需要。可以使用fun.aggregate = lengthdcast来获取每个位置的计数。

t1 <- data.table(ID = 1:100, Year = 2010:2015, Loc = LETTERS[1:7])

# Now use 'fun.aggregate' = length
dcast(t1, Year ~ Loc, fun.aggregate = length, value.var = "Loc")
#    Year A B C D E F G
# 1: 2010 3 2 2 2 2 3 3
# 2: 2011 3 3 2 2 2 2 3
# 3: 2012 3 3 3 2 2 2 2
# 4: 2013 2 3 3 3 2 2 2
# 5: 2014 2 2 2 3 3 2 2
# 6: 2015 2 2 2 2 3 3 2