【问题标题】:Merged differently sized dataframes but column returns 'NA'合并不同大小的数据框,但列返回“NA”
【发布时间】:2021-07-24 19:29:12
【问题描述】:

我有两个数据框需要合并在一起。第一个称为“rain_year”,第二个称为“难民”。 rain_year (df1) 有一个名为“sum_precip”的列。难民 (df2) 有一个名为“难民”的列。

两个数据框都有共同的“年份”和“起源”列,这就是我需要匹配的内容。 df1 的大小是 df2 的两倍多。

这里是一个df1的例子:

年份来源 sum_precip

1951 阿富汗 315

1952 阿富汗 300

1953 阿富汗 280

以此类推,所有国家都可以追溯到 1951 年。

这里是一个df2的例子:

原籍难民

1951 年阿富汗 500 强

1952 年阿富汗 400

1953 阿富汗 350

所有国家都可以追溯到 1951 年。

这两个数据框的大小不同,因为并非 df2 中的所有国家/地区在 1951 年至今的所有年份都产生了难民。因此,我希望在将 df1 合并到 df2 时会有相当多的“NA”,反之亦然。

当我运行这段代码时:

refugee_rain <- join(refugee, rain_year)

它在 sum_precip 中创建一个带有“NA”向量的新数据框。换句话说,添加了正确的列,但缺少所有值。

当我运行这段代码时:

refugee_rain <- join(refugee, rain_year)

同样的事情也会发生。

当我颠倒数据框的顺序时,“难民”列会做同样的事情。也就是说,有一列标有“难民”,但它是一个“NA”的向量,而不是数值。

我已经搜索了好几个小时的解决方案。我尝试了几种变体,包括“all=T”。这不起作用。请帮忙。

This 是我能找到的最接近其他人有类似问题的人。但是,建议的解决方案对我不起作用。

在其他人的建议下,我运行了返回以下内容的 dput 操作:

> dput(head(refugee, 5))
structure(list(Year = 1979:1983, origin = c("Afghanistan", "Afghanistan", 
"Afghanistan", "Afghanistan", "Afghanistan"), ISO = c("", "", 
"", "", ""), asylum = c("-", "-", "-", "-", "-"), asylum_ISO = c("-", 
"-", "-", "-", "-"), refugees = c(2116011L, 1952928L, 1847304L, 
1749628L, 1717966L), asylum_seekers = c(0L, 0L, 0L, 0L, 0L), 
    IDP = c(0L, 0L, 0L, 0L, 0L), Ven_displaced = c(NA_integer_, 
    NA_integer_, NA_integer_, NA_integer_, NA_integer_)), class = c("data.table", 
"data.frame"), row.names = c(NA, -5L), .internal.selfref = <pointer: 0x000001ff790e1ef0>)

> dput(head(rain_year, 5))
structure(list(Year = c(1951L, 1951L, 1951L, 1951L, 1951L), origin = c(" Afghanistan", 
" Albania", " Algeria", " Andorra", " Angola"), sum_precip = c(314.98117, 
1077.5157, 99.31164, 1012.9107, 1181.94411)), row.names = c(NA, 
-5L), groups = structure(list(Year = 1951:2016, .rows = structure(list(
    1:195, 196:390, 391:585, 586:780, 781:975, 976:1170, 1171:1365, 
    1366:1560, 1561:1755, 1756:1950, 1951:2145, 2146:2340, 2341:2535, 
    2536:2730, 2731:2925, 2926:3120, 3121:3315, 3316:3510, 3511:3705, 
    3706:3900, 3901:4095, 4096:4290, 4291:4485, 4486:4680, 4681:4875, 
    4876:5070, 5071:5265, 5266:5460, 5461:5655, 5656:5850, 5851:6045, 
    6046:6240, 6241:6435, 6436:6630, 6631:6825, 6826:7020, 7021:7215, 
    7216:7410, 7411:7605, 7606:7800, 7801:7995, 7996:8190, 8191:8385, 
    8386:8580, 8581:8775, 8776:8970, 8971:9165, 9166:9360, 9361:9555, 
    9556:9750, 9751:9945, 9946:10140, 10141:10335, 10336:10530, 
    10531:10725, 10726:10920, 10921:11115, 11116:11310, 11311:11505, 
    11506:11700, 11701:11895, 11896:12090, 12091:12285, 12286:12480, 
    12481:12675, 12676:12870), ptype = integer(0), class = c("vctrs_list_of", 
"vctrs_vctr", "list"))), row.names = c(NA, -66L), class = c("tbl_df", 
"tbl", "data.frame"), .drop = TRUE), class = c("data.table", 
"data.frame"), .internal.selfref = <pointer: 0x000001ff790e1ef0>)

我不确定我在看什么,如果这不是发布此内容的正确格式,我深表歉意。

【问题讨论】:

  • library(data.table); setDT(refugee); setDT(rain_year); refugee_rain = merge(refugee, rain_year, by = c("Year", "origin")) 对你有用吗?
  • 嗨@PavoDive ~ 谢谢你的回复。这段代码返回了一个包含所有正确变量的数据框,但是没有填写任何数据。“10 个变量的 0 次观察。”
  • 我建议您使用str(refugee)str(rain_year 检查两个数据帧的结构。用于合并的变量在两个对象中应属于同一类。也许一个是一个df中的字符,另一个是数字?
  • 编辑您的帖子,而不是“这是 df2 的示例”,将结果粘贴到 dput(head(df2, 5))(适用于 df1 和 df2)
  • 使用dput,以便我们提供帮助。用可用的数据是不可能的

标签: r dataframe join merge na


【解决方案1】:

这个很难发现:

看到refugee 中的国家名称是“阿富汗”,而在rain_year 中是“阿富汗”:A 之前有一个空格

你可以这样解决:

library(stringi)
rain_year[, origin := stri_trim_both(origin)]

然后执行合并:

refuggee_rainYear <- merge(refugee, rain_year, by = c("Year", "origin"))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多