语言: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.
答案 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]