【发布时间】:2016-04-25 17:30:11
【问题描述】:
语言: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.
【问题讨论】:
-
你注意到我之前的评论了吗? stackoverflow.com/q/25869543 和
DT[CountryKey, on=c(Birth = "Country"), .N, by=.EACHI] -
是的,我已经写了并且打算在这里写,但是你没有给我足够的时间。谢谢。
-
好的,没问题。我会把它标记为骗子,但如有必要可以撤消
-
好的。不确定这是否是您所追求的,但
DT[unique(CountryKey), on=c(Birth = "Country"), .N, by=.EACHI]是一个简单的扩展。 -
好的,试试
DT[unique(CountryKey$Country), on="Birth", .N, by=.EACHI]。包的小插曲是习惯语法工作方式的好方法:github.com/Rdatatable/data.table/wiki/Getting-started
标签: r data.table