在data.table R中使用两个单独的数据集创建汇总表
语言:R 包:data.table 我有两个数据集:一个是所有国家的名字都列在关键数据集中,另一个是我有一些关于人口的数据,其中一个领域是出生国。我想制作每个国家出生人口的数据表。现在可能有一些国家没有参与者出生。如何使用data.table命令创建这样的表 例如:在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
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]