【问题标题】:R how to merge 2 data frames on 3 columns all with different column namesR如何合并3列上的2个数据框,所有列名都不同
【发布时间】:2021-04-11 20:48:47
【问题描述】:

我正在尝试对同一列的两个不同名称的不同数据集进行内部连接。我需要合并三列。我检查了 stackoverflow 和其他来源,但问题合并在一列的同名数据源上。

当前代码:

state <- c('AZ','MD','NY', 'CA', 'FL')
STATE_ID <- c('AZ','MD','NY', 'CA', 'FL')
month <- c(1,2,3,4,5,6,7,8,9,10,11,12)
MONTH_ID <- c(1,2,3,4,5,6,7,8,9,10,11,12)
year <- c(2001, 2002, 2003, 2004)
YEAR_ID <- c(2001, 2002, 2003, 2004)
# note all rates are fake numbers
eduRate <- (7.5, 6.2, 1.3, 9.9, ....)
otherCol <- c('a','b','c','d','e','f','g' ....)
DROPOUT_RATE <- c(1.2, 3.2, 5.3, 1.9, ....)
someOtherCol <- c('a','b','c','d','e','f','g' ....)
anotherCol <- c('a','b','c','d','e','f','g' ....)

data1 <- data.frame(state, month, year, eduRate, otherCol)
data2 <- data.frame(STATE_ID, MONTH_ID, YEAR_ID, DROPOUT_RATE, someOtherCol, anotherCol)

mergeDf <- merge(x=data1, y=data2, 
                    by.x=state, by.y=STATE_ID, 
                    by.x=month, by.y=MONTH_ID,
                    by.x=year, by.y=YEAR_ID)    #  <-- NOT WORKING

mergeDf(x=data1, y=data2, by=c("state","year","month"))  # <-- cannot use because column names per data set different

想要的输出(不需要多余的列

#merge on state, month and year to get both edu and dropout rates

state, month, year, eduRate, DROPOUT_RATE
AZ      1      2001   7.5       1.2
AZ      2      2002   9.2       3.2
AZ      3      2003   1.3       1.2
...
AL      1      2001   2.5       1.9
AL      2      2002   5.2       1.7
AL      3      2003   4.3       3.4
...
WY      1      2001   2.5       1.9
WY      2      2002   5.2       1.7
WY      3      2003   4.3       3.4

感谢您提前提供任何帮助。

【问题讨论】:

  • 您的代码无法被您的读者运行。有很多错误。例如,eduRate &lt;- (7.5, 6.2, 1.3, 9.9, ....) 不是有效行,许多....s 也不是。此外,&lt;-- NOT WORKING 不是有效的评论方式。请改用#,就像您之前在代码中使用的那样。最后,您的许多数据帧无法形成,因为它们的元素长度不同。请发布可以运行的示例代码。
  • 我输入了......所以我不需要输入所有 6000 行。
  • 如果试图帮助您的人无法测试他们对您问题的解决方案是否有效,那么您就不太可能获得帮助。请提供您的读者可以运行的代码。
  • 其他人可以帮忙吗?我只需要合并语句的帮助。我的数据框很清晰。

标签: r merge


【解决方案1】:

我喜欢 tidyverse 在 dplyr 中加入多个键的语法。

state <- c('AZ','MD','NY', 'CA')
STATE_ID <- c('AZ','MD','NY', 'CA')
month <- c(1,2,3,4)
MONTH_ID <- c(1,2,3,4)
year <- c(2001, 2002, 2003, 2004)
YEAR_ID <- c(2001, 2002, 2003, 2004)
# note all rates are fake numbers
eduRate <- c(7.5, 6.2, 1.3, 9.9)
otherCol <- c('a','b','c','d')
DROPOUT_RATE <- c(1.2, 3.2, 5.3, 1.9)
someOtherCol <- c('a','b','c','d')
anotherCol <- c('a','b','c','d')

data1 <- data.frame(state, month, year, eduRate, otherCol)
data2 <- data.frame(STATE_ID, MONTH_ID, YEAR_ID, DROPOUT_RATE, someOtherCol, anotherCol)


df<- data1 %>%
  left_join(data2, by=c("state"="STATE_ID","month"="MONTH_ID", "year"="YEAR_ID"))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    • 2021-01-16
    相关资源
    最近更新 更多