合并了不同大小的数据框,但列 returns 'NA'

Merged differently sized dataframes but column returns 'NA'

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

两个数据框都有共同的列“Year”和“origin”,这是我需要匹配的。 df1 的大小是 df2 的两倍多。

这里是 df1 的例子:

起源年份sum_precip

1951 阿富汗 315

1952 阿富汗 300

1953 阿富汗 280

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

这里是 df2 的例子:

年出身难民

1951 阿富汗 500

1952 阿富汗 400

1953 阿富汗 350

等等所有国家回到 1951 年。

这两个数据框的大小不同,因为并非 df2 中的所有国家/地区在 1951 年至今的所有年份都产生了难民。因此,我预计在将 df1 合并到 df2 或将 df1 合并到 df2 时会有相当数量的 'NA'。

当我运行这段代码时:

refugee_rain <- join(refugee, rain_year)

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

当我运行这段代码时:

refugee_rain <- join(refugee, rain_year)

同样的事情发生了。

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

我花了好几个小时四处寻找解决方案。我尝试了几种变体,包括“all=T”。这是行不通的。请帮忙。

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

根据其他人的建议,我有 运行 返回以下内容的 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>)

我不确定我在看什么,如果这不是 post 的正确格式,我深表歉意。

这个很难发现:

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

你可以这样解决:

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

然后执行合并:

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