【问题标题】:Merge dataframes with unequal rows, and no matching column names R合并具有不相等行且没有匹配列名的数据框 R
【发布时间】:2020-03-05 06:48:28
【问题描述】:

我正在尝试将 df1(汇总表)合并到 df2(主汇总表)中。 这是df2的快照,忽略随机42,只是终极问题的答案。 这是 df1 的示例。

最后,我有一个名为 Dates 的向量。这匹配作为 df2 列名的日期。 我正在尝试循环浏览 20 个文件,并收集该文件的摘要统计信息。然后我想将该数据输入 df2 以永久存储。我只需要输入 Earned 列。 我曾尝试使用合并,但由于它们没有共享列名,所以我无法使用。 我的下一个尝试是尝试这个。但它给出了一个错误,因为行号不相等。

df2[,paste(Dates[i])] <- cbind(df2,df1)

然后我想,如果我指定了确切的位置,它可能会起作用。

df2[1:length(df1$Earned),Dates[i]] <- df1$Earned

但这给出了错误“新列会在现有列之后留下孔” 所以我想再试一次,但使用 cbind。

df2[1:length(df1$Earned),Dates[i]] <- cbind(df2, df1$Earned)
##This gave an error for differing row numbers
df2 <- cbind(df2[1:length(df1$Earned),Dates[i]],df1$earned)
## This "worked" but it replaced all of df2 with df1$earned, so I basically lost the rest of the master table

任何想法将不胜感激。谢谢你。

【问题讨论】:

  • 如果它们的长度不均匀且没有公共变量,则将它们存储在列表中更有意义。
  • 列表的问题是我通过 for 循环运行它,而 df2 的最终产品将是一个三角形数据框。如果我要使用列表,我将如何跟踪该值对应的年份和日期。
  • 您可以在列表中存储数据帧。如果所述数据帧具有您想要的 collums,您只需要堆叠方括号并使用双括号来取消列出元素 - 例如 list_1["DF_1"][["Collum_1"]] 将是一个向量

标签: r dataframe merge


【解决方案1】:

到目前为止,我发现的唯一解决方案是将 df1$Earned 强制转换为向量。然后将向量附加为 df2 的确切长度。然后我可以通过特定列将值插入 df2 。

temp_values <- append(df1$Earned,rep(0,(length(df2$TreatyYear)-length(df1$TreatyYear))),after=length(df1$Earned))
df2[,paste(Dates[i])] <- temp_values

这是一种迂回的修复方式,但不是一种非常愉快的方式。任何更好的想法将不胜感激。

【讨论】:

    【解决方案2】:

    这样的事情可能会奏效:

    df1[df1$TreatyYear %in% df2$TreatyYear, Dates] <- df2$Earned
    

    示例

    df <- data.frame(matrix(NA,4,4))
    df$X1 <- 1:4
    
    df[df$X1 %in% c(1,2),c("X3","X4")] <- c(1,2)
    

    【讨论】:

    • 这仍然会导致行长不等的错误。问题来自df1$TreatyYear %in% df2$TreatyYear 只是呈现真值。对于数据框行的子集,我必须给它一个数字。
    • 运行2009:2019 %in% 2009:2010。为什么这会给出所有 TRUE?您的代码可能存在问题。
    • 你是对的。我已将值切换为 2009:2010 %in% 2009:2019。只给我 2 个真值。一旦我切换了数据框,它就起作用了。
    猜你喜欢
    • 2015-11-10
    • 1970-01-01
    • 1970-01-01
    • 2020-03-23
    • 2015-06-28
    • 2021-03-11
    • 1970-01-01
    • 2016-05-11
    • 1970-01-01
    相关资源
    最近更新 更多