【问题标题】:Creating summary table using two separate datasets in data.table R使用 data.table R 中的两个单独数据集创建汇总表
【发布时间】: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/25869543DT[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


【解决方案1】:

这是一种方法:

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

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

【讨论】:

    【解决方案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]
    

    【讨论】:

    • “最佳方式”究竟基于什么指标?并修复那些&lt;- 并用:= 替换它们。
    • @Arman 感谢您的意见。我知道如何使用表。我试图以 data.table 的方式做到这一点。但我也喜欢你的回答。
    • @Frank 你试过你的答案了吗?第二个给出错误。
    • @ilyas 嗯,它适用于我(data.table 1.9.7,R 3.2.4)。如果您提到具体的错误,也许我们可以弄清楚如何解决它。否则,我可以将我的编辑还原为这个答案。
    • @ilyas 在R聊天室讨论可能更方便:chat.stackoverflow.com/rooms/25312/r-public
    猜你喜欢
    • 1970-01-01
    • 2020-11-27
    • 1970-01-01
    • 1970-01-01
    • 2017-12-31
    • 2018-08-03
    • 1970-01-01
    • 1970-01-01
    • 2018-09-04
    相关资源
    最近更新 更多