【问题标题】:Merge unequal dataframes by matching two rows replace with 0 the missing values in R通过匹配两行来合并不相等的数据框,将 R 中的缺失值替换为 0
【发布时间】:2021-03-03 19:52:04
【问题描述】:

我想通过匹配两列合并两个不相等的数据框并用 0 替换缺失值来创建一个新的数据框。 这是我拥有的数据框的两个示例:

df1
ID YEAR INTERVIEW  ID_HOUSEHOLD
1    2017           300
1    2018           300
1    2019           300
2    2017           150
2    2018           150
2    2019           150
3    2017           420
3    2018           420

df2
ID YEAR INTERVIEW  YEARS_EDU
1    2017           10
1    2018           10
1    2019           10
3    2017           3
3    2018           3

*请注意,在第二个数据框中,我没有个人 2 的信息 我想得到以下数据框:

df3
df1
ID YEAR INTERVIEW  ID_HOUSEHOLD  YEARS_EDU
1    2017           300           10
1    2018           300           10
1    2019           300           10
2    2017           150           0
2    2018           150           0
2    2019           150           0
3    2017           420           3
3    2018           420           3

我正在尝试:

df3<-merge(df1,df2, by="ID", all=TRUE)
df3<-merge(df1,df2, by="ID","YEAR_INTERVIEW", all=TRUE)

第一个选项通过多年的采访复制了数百个 ID 观察结果,而第二个选项给了我 0 个值。

任何帮助将不胜感激 :) 谢谢

【问题讨论】:

    标签: r dataframe merge


    【解决方案1】:

    by 必须是vector,即我们可以使用c() 创建一个向量。另外,all = TRUE 是全连接,但这里应该是左连接,所以是 all.x = TRUE。如果没有匹配,则默认为NA

    out <- merge(df1,df2, by=c("ID","YEAR_INTERVIEW"), all.x=TRUE)
    

    NAs 可以转换为 0

    out$YEARS_EDU[is.na(out$YEARS_EDU)] <- 0
    

    -输出

    out
    #  ID YEAR_INTERVIEW ID_HOUSEHOLD YEARS_EDU
    #1  1           2017          300        10
    #2  1           2018          300        10
    #3  1           2019          300        10
    #4  2           2017          150         0
    #5  2           2018          150         0
    #6  2           2019          150         0
    #7  3           2017          420         3
    #8  3           2018          420         3
    

    数据

    df1 <- structure(list(ID = c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L), 
     YEAR_INTERVIEW = c(2017L, 
    2018L, 2019L, 2017L, 2018L, 2019L, 2017L, 2018L), ID_HOUSEHOLD = c(300L, 
    300L, 300L, 150L, 150L, 150L, 420L, 420L)), class = "data.frame",
    row.names = c(NA, 
    -8L))
    
    
    df2 <- structure(list(ID = c(1L, 1L, 1L, 3L, 3L), 
    YEAR_INTERVIEW = c(2017L, 
    2018L, 2019L, 2017L, 2018L), YEARS_EDU = c(10L, 10L, 10L, 3L, 
    3L)), class = "data.frame", row.names = c(NA, -5L))
    

    【讨论】:

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