使用data.table R中的两个单独数据集创建汇总表

时间:2016-04-25 17:30:12

标签: r data.table

语言:R

包:data.table

我有两个数据集:一个列出所有国家/地区名称(关键数据集),另一个我有一些关于一个字段是出生国家的人口数据的数据集。我想制作每个国家出生人数的数据表。现在可能有一些国家的参与者都没有出生。如何使用data.table命令创建这样的表?

示例:

CountryKey = data.table(Country = LETTERS[1:5])
DT = data.table(Person = c(1,2,3,4,5,6,7), Birth = LETTERS[c(1,1,2,3,2,1,3)])

DT
   Person Birth
1:      1     A
2:      2     A
3:      3     B
4:      4     C
5:      5     B
6:      6     A
7:      7     C

CountryKey
   Country
1:       A
2:       B
3:       C
4:       D
5:       E

DT[, j = .(.N), by = .(Birth)]
   Birth N
1:     A 3
2:     B 2
3:     C 2

由于没有人出生在D,而E他们没有出现在输出中。但是我希望看到它们的值为零。

@Frank回答了这个问题。

DT[CountryKey, on=c(Birth = "Country"), .N, by=.EACHI]
   Birth N
1:     A 3
2:     B 2
3:     C 2
4:     D 0
5:     E 0

但是,CountryKey文件的行可能不唯一。假设它只是一些类似于DT的数据集,同一个国家/地区有很多行。那我们怎么办呢?

CountryKey = data.table(Country =c('A','B','B','C','C','D','E','D','D'))

   Country
1:       A
2:       B
3:       B
4:       C
5:       C
6:       D
7:       E
8:       D
9:       D

上述解决方案给出的结果不是我想要的。我想仅查看每个国家/地区的唯一条目。

DT[CountryKey, on=c(Birth = "Country"), .N, by=.EACHI]
   Birth N
1:     A 3
2:     B 2
3:     B 2
4:     C 2
5:     C 2
6:     D 0
7:     E 0
8:     D 0
9:     D 0

@ Frank的答案部分有效:

DT[unique(CountryKey), on=c(Birth = "Country"), .N, by=.EACHI]
   Birth N
1:     A 3
2:     B 2
3:     C 2
4:     D 0
5:     E 0

但是,如果CountryKey有多个列,则不会:

   CountryKey = data.table(Country =c('A','B','B','C','C','D','E','D','D'), 
Somevalue = sample(x = 3, size = 9, replace = T))

DT[unique(CountryKey), on=c(Birth = "Country"), .N, by=.EACHI]
   Birth N
1:     A 3
2:     B 2
3:     B 2
4:     C 2
5:     C 2
6:     D 0
7:     E 0
8:     D 0

@Frank的解决方案:

DT[i = unique(CountryKey$Country), on="Birth", .N, by=.EACHI]
P.S. : You should have 1.9.7. Earlier versions will give an error.

2 个答案:

答案 0 :(得分:3)

以这种方式:

DT[.(unique(CountryKey$Country)), .N, on="Birth", by=.EACHI]

OP报告说这会在data.table 1.9.6中出错(说Birth是一个因素)。在这种情况下,请先运行DT[, Birth := as.character(Birth)]

答案 1 :(得分:2)

我认为编码DT $ Birth作为一个因素,其中等级是CountryKey $ Country的唯一值,实际上是处理此问题的最优雅方式(概念上和实际上)。因子类完全是为了处理这样的情况而编写的。这也适用于data.tables以及data.frames。

CountryKey = data.table(Country = LETTERS[1:5])
DT = data.table(Person = c(1,2,3,4,5,6,7), Birth = LETTERS[c(1,1,2,3,2,1,3)])

DT$Birth_factor<-as.factor(DT$Birth)
levels(DT$Birth_factor)<-unique(CountryKey$Country)
table(DT$Birth_factor)

table()的结果

> table(DT$Birth_factor)

A B C D E 
3 2 2 0 0 

data.table特定的模拟可能如下所示:

DT[, Birth := factor(Birth, levels = union(Birth, CountryKey$Country))]
DT[levels(Birth), .N, on = "Birth", by=.EACHI]