【发布时间】:2014-12-04 17:11:33
【问题描述】:
我在 R 中运行一个配方,收到如下错误:
> left_join(ann2012full,agglevel)
Joining by: "agglvl_code"
Error in data.table::setkeyv(y, by$x) : x is not a data.table。
这两个变量是ann2012full,一个300万+个obs。 15 个变量和 agglevel,一个 56 obs。 2 个变量,取自 2 个 .csv 文件。
根据其他帖子,还有其他人对类似问题的dplyr有问题,但by方法的框架我不清楚。有没有人能够像更新之前一样重复left_join 功能?
这两个变量有一个交点,并且该函数似乎通过在错误之前报告Joining by: "agglvl_code"来确认这一点:
> intersect(names(ann2012full),names(agglevel))
[1] "agglvl_code"
有问题的前几行变量...
head(ann2012full)
area_fips own_code industry_code agglvl_code size_code year qtr disclosure_code annual_avg_estabs_count annual_avg_emplvl
1: 01000 0 10 50 0 2012 A 116233 1828248
2: 01000 1 10 51 0 2012 A 1252 56031
3: 01000 1 102 52 0 2012 A 1252 56031
4: 01000 1 1021 53 0 2012 A 599 11734
5: 01000 1 1022 53 0 2012 A 2 13
6: 01000 1 1023 53 0 2012 A 17 161
total_annual_wages taxable_annual_wages annual_contributions annual_avg_wkly_wage avg_annual_pay
1: 76768801894 13424728725 419383612 808 41990
2: 4194319351 0 0 1440 74857
3: 4194319351 0 0 1440 74857
4: 719641114 0 0 1179 61330
5: 436204 0 0 662 34437
6: 12253089 0 0 1468 76343
head(agglevel)
agglvl_code agglvl_title
1 10 National, Total Covered
2 11 National, Total -- by ownership sector
3 12 National, by Domain -- by ownership sector
4 13 National, by Supersector -- by ownership sector
5 14 National, NAICS Sector -- by ownership sector
6 15 National, NAICS 3-digit -- by ownership sector
使用 str() 时有问题的 vars 是什么样的...
> str(ann2012)
Classes ‘data.table’ and 'data.frame': 3556289 obs. of 15 variables:
$ area_fips : chr "01000" "01000" "01000" "01000" ...
$ own_code : int 0 1 1 1 1 1 1 1 1 1 ...
$ industry_code : chr "10" "10" "102" "1021" ...
$ agglvl_code : int 50 51 52 53 53 53 53 53 53 53 ...
$ size_code : int 0 0 0 0 0 0 0 0 0 0 ...
$ year : int 2012 2012 2012 2012 2012 2012 2012 2012 2012 2012 ...
$ qtr : chr "A" "A" "A" "A" ...
$ disclosure_code : chr "" "" "" "" ...
$ annual_avg_estabs_count: int 116233 1252 1252 599 2 17 46 32 27 4 ...
$ annual_avg_emplvl : int 1828248 56031 56031 11734 13 161 1799 6131 903 632 ...
$ total_annual_wages :Class 'integer64' num [1:3556289] 3.79e-313 2.07e-314 2.07e-314 3.56e-315 2.16e-318 ...
$ taxable_annual_wages :Class 'integer64' num [1:3556289] 6.63e-314 0.00 0.00 0.00 0.00 ...
$ annual_contributions :Class 'integer64' num [1:3556289] 2.07e-315 0.00 0.00 0.00 0.00 ...
$ annual_avg_wkly_wage : int 808 1440 1440 1179 662 1468 1581 1231 370 1716 ...
$ avg_annual_pay : int 41990 74857 74857 61330 34437 76343 82237 64031 19257 89240 ...
- attr(*, ".internal.selfref")=<externalptr>
> str(agglevel)
'data.frame': 56 obs. of 2 variables:
$ agglvl_code : int 10 11 12 13 14 15 16 17 18 21 ...
$ agglvl_title: chr "National, Total Covered" "National, Total -- by ownership sector" "National, by Domain -- by ownership sector" "National, by Supersector -- by ownership sector" ...
我为此配方加载了 10 个库;总共有28个加载。
> search()
[1] ".GlobalEnv" "package:tcltk" "package:microbenchmark" "package:rbenchmark" "package:choroplethr"
[6] "package:RColorBrewer" "package:maps" "package:ggplot2" "package:stringr" "package:dplyr"
[11] "package:plyr" "package:sqldf" "package:RSQLite" "package:DBI" "package:gsubfn"
[16] "package:proto" "package:data.table" "package:bit64" "package:bit" "tools:rstudio"
[21] "package:stats" "package:graphics" "package:grDevices" "package:utils" "package:datasets"
[26] "package:methods" "Autoloads" "package:base"
**************************************** 找到解决方法 ********* ************************
我深究:我使用了merge,而不是left_join,将by 指定为比NULL 更多。那么,到底是什么……
codes <- c('agglevel','industry','ownership','size')
ann2012full <- ann2012
for(i in 1:length(codes)){
eval(parse(text=paste('ann2012full <- left_join(ann2012full, ',codes[i],')', sep='')))
}
现在是……
codes <- c('agglevel','industry','ownership','size')
ann2012full <- ann2012
for(i in 1:length(codes)){
barTitle <- intersect(names(ann2012full),names(eval(parse(text=codes[i]))))
eval(parse(text= paste('ann2012full <- merge(ann2012full, ',codes[i],',by="',barTitle,'")', sep='')))
}
但是,dplyr 方法中的***_join 似乎仍有一些错误需要通过最新更新来解决。如果有其他意见,我很想听听,因为它只适用于修改后的代码merge。
谢谢,
【问题讨论】:
-
能不能提供几行ann2012full和agglevel?另外,你能展示一下 str() 对它们两个的返回值吗?最后,如果您显示已加载的“库数量”,它会对我们有所帮助。
-
看起来
dplyr的行为在新版本中可能有所改变。 -
似乎是这样:rstudio 有一些关于截至 2014 年 10 月 14 日的改进的详细信息,但我没有看到连接,并且更改似乎是可选的。
-
这条评论似乎与之前的问题有关,我现在决定要么目前无法解决,要么没有提供新信息。 stackoverflow.com/questions/26073098/…
-
不要在注释中放那么多代码。您可以使用新见解更新您的问题,也可以为您自己的问题提供答案。
标签: r data.table dplyr