【问题标题】:Merging data frames with not all variables in common合并并非所有变量共有的数据框
【发布时间】:2014-06-11 08:39:43
【问题描述】:

我想合并两个没有共同变量的大数据框。我已经尝试过“合并”,但我没有得到我想要的。

一个例子:

# Data frame to merge 1
ID <- c("1", "2", "3", "4", "5")
Colour <- c("Red", "Red", "Red", NA, NA)
Flavour <- c("Sweet", "Sweet", "Sweet", NA, NA)
Price <- c(5, 10, 15, 20, 25)
df1 <- data.frame(ID, Colour, Flavour, Price)
rm(ID, Colour, Flavour, Price)

# Data frame to merge 2
ID <- c("4", "5")
Colour <- c("Green", "Green")
Flavour <- c("Bitter", "Bitter")
df2 <- data.frame(ID, Colour, Flavour)
rm(ID, Colour, Flavour)

# What I'd like to get
ID <- c("1", "2", "3", "4", "5")
Colour <- c("Red", "Red", "Red", "Green", "Green")
Flavour <- c("Sweet", "Sweet", "Sweet", "Bitter", "Bitter")
Price <- c(5, 10, 15, 20, 25)
RESULT <- data.frame(ID, Colour, Flavour, Price)
rm(ID, Colour, Flavour, Price)

非常感谢任何帮助!

【问题讨论】:

  • df1df2no 个公共列。在这种情况下,您需要使用mergeby.xby.x 参数明确告诉merge df1 中的哪些列与df2 中的哪些列相关。好好阅读?merge
  • 您好 jbaums,感谢您的评论!对不起,是的,有共同的变量。刚刚编辑。
  • merge 不能很好地使用该结构(它会为 NA 添加行)。这是plyr 解决方案:library(plyr); ab &lt;- rbind.fill(df1, df2); colFun &lt;- function(x){x[which(!is.na(x))]}; ddply(ab, .(ID), function(x){ colwise(colFun)(x) })。但这是this question 的欺骗。另请参阅@joran 那里给出的data.table 方法。
  • 感谢您的链接!尝试搜索有关该主题的问题,但找不到任何内容。
  • 嗨,在标记之前花点时间阅读标记摘录。 dataframes 用于熊猫,而您需要 data.frame 在这里。下次小心点。请参阅此元帖子。 Warn [r] users from adding [dataframes] tag instead of [data.frame] tag

标签: r merge dataframe


【解决方案1】:

也许你根本不需要合并,如果你上面描述的正是你所需要的。这行得通吗:

# Data frame to merge 1
df1 <- data.frame(ID=c("1", "2", "3", "4", "5"),
                  Colour=c("Red", "Red", "Red", NA, NA),
                  Flavour=c("Sweet", "Sweet", "Sweet", NA, NA),
                  Price=c(5, 10, 15, 20, 25),
                  stringsAsFactors=FALSE)

df2<- data.frame(ID2=c("4", "5"),
                  Colour2=c("Green", "Green"),
                  Flavour2=c("Bitter", "Bitter"),
                  stringsAsFactors=FALSE)

# Assuming the two dfs are ordered on ID. If not, do so.
df1[df1[["ID"]] %in% df2[["ID2"]],
    c("Colour", "Flavour")] = df2[c("Colour2", "Flavour2")]

这个想法是简单地将值从 df2 替换到 df1 中,只要它们需要。

【讨论】:

    【解决方案2】:

    我会这样做: 安装gtools

    library(gtools)
    df_new <- smartbind(df1,df2)
    

    你会得到七行,df1df2 的组合。为了删除不必要的行并替换 na,我使用了这个技巧:

    df_new <- df_new[-1] #remove the ID column
    
    df_new[4:5,][is.na(df_new[4:5,])] <- df_new[6:7,][!is.na(df_new[6:7,])]
    
    df_new <- df_new[complete.cases(df_new),]
    
    df_new$ID <- c(1:nrow(df_new)) #add ID column back 
    

    【讨论】:

    • merge(df1, df2, all=T) 在这种情况下与 smartbind 的作用相同。 (实际上你的代码给我抛出了错误——你能仔细检查一下吗?)
    【解决方案3】:

    不幸的是,merge 不能很好地适应这种结构(它会为 NA 添加行)。

    我撤回了我的重复投票,因为问题实际上有点不同。

    我们可以使用@joran here 提供的大部分方法,但需要更改一个小细节。因为你的 data.frames 有不同的列集,你需要使用rbind.fill 而不是rbind

    library(plyr)
    ab <- rbind.fill(df1, df2)
    colFun <- function(x){x[which(!is.na(x))]}
    ddply(ab, .(ID), function(x){ colwise(colFun)(x) })
    
      ID Colour Flavour Price
    1  1    Red   Sweet     5
    2  2    Red   Sweet    10
    3  3    Red   Sweet    15
    4  4  Green  Bitter    20
    5  5  Green  Bitter    25
    

    【讨论】:

      猜你喜欢
      • 2018-06-02
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      • 2014-07-27
      • 1970-01-01
      • 2016-10-19
      • 2017-04-22
      相关资源
      最近更新 更多