【问题标题】:Merging two datasets based on column in R基于R中的列合并两个数据集
【发布时间】:2020-07-17 08:22:10
【问题描述】:

我有两个最初来自同一来源的数据集,但由于分类,我发现有必要将它们分开。 我想知道如何根据两列中的缺失值将这些数据集合并回来? 换句话说,我需要数据集 1 中的所有行(列与来自同一来源的列相同),然后在数据集 1 中缺少行时基于指示年份和国家代码的列从数据集 2 中提取行?

df1 <- read.table(
text =
"Year, Data,Country
1,2,US
3,2,US
5,1,US
1,3,UK
2,5,UK
4,3,UK
", sep = ",", header = TRUE)
df1

df2 <- read.table(
text =
"Year, Data,Country
1,3,US
4,5,US
5,8,US
2,9,UK
3,4,UK
", sep = ",", header = TRUE)
df2

df3 <- read.table(
text =
"Year, Data,Country
1,2,US
3,2,US
4,5,US
5,1,US
1,3,UK
2,5,UK
3,4,UK
4,3,UK
", sep = ",", header = TRUE)
df3

df3 从 df1 和 df2 中提取缺失的年份值。如何对这种提取进行编码?

【问题讨论】:

标签: r join merge


【解决方案1】:

欢迎来到 Stackoverflow !!!下次请提供您的数据样本,而不是链接或图像或图像的链接。例如,我使用read.table() 创建样本数据来测试解决方案。数据可能很小,因为如果一个解决方案适用于四行或五行,它将适用于所有行。如果解决方案是矢量化的,则尤其如此,如下所示。

df1 <- read.table(
text =
"Year, Data
1,2
2,4
3,2
5,1
", sep = ",", header = TRUE)

df2 <- read.table(
text =
"Year, Data
1,3
2,4
4,5
5,8
", sep = ",", header = TRUE)

接下来我们简单地将不在第一个数据框中的行和rbind 提取到第一个数据框中。我们需要指定drop = T,以便行号绑定,这会将来自df2的行放在新数据框的第四行,否则将放在新数据框的末尾。

new_yr <- which(!(df2$Year %in% df1$Year))

df <- rbind(df1[, , drop = T], df2[new_yr, , drop = T])

df
Year Data
1    1    2
2    2    4
3    3    2
4    5    1
5    4    5

【讨论】:

  • 感谢您的帮助。显然,我错过了一些关于发布的指导方针。我将根据您的示例进行更改,以在明天进一步扩展我的问题,因为我今天无法编辑我的问题。有问题的数据集也按国家/地区代码分类,因此我无法指定 drop = T,因为行号因年份和国家/地区而异。
  • 你试过我发布的代码了吗? drop = T 应该仍然适用于您的情况。
  • 是的,代码的应用为原始数据集提供了更多的观察结果。诚然,我原来的帖子对问题的描述很差,所以沟通不畅就到了我的尽头。
【解决方案2】:

您可以执行full_join 并使用coalesce 选择Data.xData.y 之间的非NA 值。

library(dplyr)

full_join(df1, df2,  by = c('Country', 'Year')) %>%
   mutate(Date = coalesce(Data.x, Data.y)) %>%
   select(-Data.x, -Data.y) %>%
   arrange(Country)

#  Year Country Date
#1    1      UK    3
#2    2      UK    5
#3    4      UK    3
#4    3      UK    4
#5    1      US    2
#6    3      US    2
#7    5      US    1
#8    4      US    5

base R 中的相同逻辑:

transform(merge(df1, df2, by = c('Country', 'Year'), all = TRUE), 
          Data = ifelse(is.na(Data.x), Data.y, Data.x))[names(df1)]

【讨论】:

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