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

在data.table R中使用两个单独的数据集创建汇总表,r,data.table,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

语言: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中,所以它们不会出现在输出中。但是我希望看到它们的值为零

@弗兰克问了这个问题

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
@弗兰克的回答部分有效:

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.

我认为将DT$Birth编码为一个因子,级别是CountryKey$Country的唯一值,实际上是从概念上和实践上实现这一点的最优雅的方式。factor类的编写正是为了处理这样的情况。这也适用于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)
data.table特定的模拟可能如下所示:

DT[, Birth := factor(Birth, levels = union(Birth, CountryKey$Country))]
DT[levels(Birth), .N, on = "Birth", by=.EACHI]
这里有一个方法:

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

OP报告这在数据中给出了一个错误。表1.9.6说出生是一个因素。在这种情况下,首先运行DT[,Birth:=as.characterBirth]。

您注意到我前面的评论了吗?DT[CountryKey,on=cBirth=Country,.N,by=.EACHI]是的,我写了,并且打算写在这里,但是你没有给我足够的时间。谢谢。好的,没问题。我会把它标记为一个复制品,但是如果必要的话可以撤销它。不确定这是否是您想要的,但DT[uniqueCountryKey,on=cBirth=Country,.N,by=.EACHI]是一个简单的扩展。好的,试试DT[uniqueCountryKey$Country,on=Birth,.N,by=.EACHI]。软件包的小插曲是一个很好的习惯语法工作方式的方法:最好的方法是基于什么标准?并修复这些@Arman感谢您的输入。我知道怎么用桌子。我试着用data.table的方式来做这件事。但我也喜欢你的答案。@Frank你试过你的答案了吗?第二个给出了一个错误。@ilyas Hm,它适用于我的数据。表1.9.7,R 3.2.4。如果你提到了具体的错误,也许我们可以找到解决方法。否则,我可以将我的编辑还原为此答案。@ilyas在R聊天室讨论可能更方便:
DT[.(unique(CountryKey$Country)), .N, on="Birth", by=.EACHI]