【发布时间】: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,以便我们提供帮助。用可用的数据是不可能的