【问题标题】:How can I combine two dataframes with different lengths in R?如何在 R 中组合两个不同长度的数据帧?
【发布时间】:2016-05-16 15:28:05
【问题描述】:

我有两个数据框,例如:

我想得到类似的东西:

这里是可重复性的数据框:

df1 <- data.frame(descripcion_cuenta_N2 = c("Consumos", "Costes Personal", "Fungible Equipamiento", "Servicios"), anualidad = rep(2014, 4), valor = c(10, 11, 12, 13))
df2 <- data.frame(descripcion_cuenta_N2 = c("Consumos", "Costes Personal", "Fungible Equipamiento","Prestaciones", "Servicios"), anualidad = rep(2014, 5), valor = c(11, 20, 8, 9))

其中丢失的位置用 0 填充的数据帧,因为在某些情况下我没有得到具有相同行数的数据帧,在这些情况下 rbind 失败,我得到一个错误。

应该使用哪个指令来组合这些数据帧?

谢谢

PS:我知道一旦数据框组合在一起,我可以删除重复的行。

【问题讨论】:

  • 发布数据表的图片并不是获得帮助的最佳方式。您可以将您导入的实际数据框发布到 R 中吗?

标签: r dataframe rbind


【解决方案1】:

尝试在 dplyr 包中使用 left_join。

library(dplyr)

# make fake data
df1 <- data.frame(id = c("A", "B", "C", "D", "E"), val = rpois(5, 5))
df2 <- data.frame(id = c("A", "B", "C", "E"), val = rpois(4, 20))

# use left_join
df3 <- left_join(df1, df2, by = "id")

# rename and set NAs to 0
names(df3) <- c("id", "val", "val")
df3[is.na(df3)] <- 0

【讨论】:

    【解决方案2】:

    首先,在两列中有两个具有相同名称或相同变量的变量不是一个好习惯。最好有重复的观察结果(例如,在这种情况下,Consmos 有两次)。

    基于这样简单的行绑定或者合并两个数据框:

    df1 <- data.frame(descripcion_cuenta_N2 = c("Consumos", "Costes Personal", "Fungible Equipamiento", "Servicios"), anualidad = rep(2014, 4), valor = c(10, 11, 12, 13))
    df2 <- data.frame(descripcion_cuenta_N2 = c("Consumos", "Costes Personal", "Fungible Equipamiento", "Servicios"), anualidad = rep(2014, 4), valor = c(11, 20, 8, 9))
    df <- merge(df1, df2, all = TRUE)
    

    给出:

      descripcion_cuenta_N2 anualidad valor
    1              Consumos      2014    10
    2              Consumos      2014    11
    3       Costes Personal      2014    11
    4       Costes Personal      2014    20
    5 Fungible Equipamiento      2014     8
    6 Fungible Equipamiento      2014    12
    7             Servicios      2014     9
    8             Servicios      2014    13
    

    如上所述,这种方式更好。

    如果你坚持你的要求,你只需指定要在合并中使用的变量:

    df <- merge(df1, df2, by = c("descripcion_cuenta_N2", "anualidad"))
    

    导致:

      descripcion_cuenta_N2 anualidad valor.x valor.y
    1              Consumos      2014      10      11
    2       Costes Personal      2014      11      20
    3 Fungible Equipamiento      2014      12       8
    4             Servicios      2014      13       9
    

    PS:如果您的数据框在 R 中给出,它会更容易回答。这会使您的问题可重现且易于回答。见How to make a great R reproducible example?

    【讨论】:

    • 不客气@TheoSloot。如果这回答了您的问题,请将其标记为答案。谢谢
    • 您好,感谢您的回答,尽管我有明显的错误。帖子中的图片是错误的,第二个中的“anualidad”列是“2015”,而不是“2014”,所以我可以制作一个数据框,我可以在其中比较相同服务的不同值在不同年。问题是不同年份可能有不同的服务,我不能把它们结合起来。我会尝试“合并”指令。再次感谢。
    • 由@russodl 解决。问题的重点是我有两个不同长度的df。无论如何感谢您的编辑和答案。
    【解决方案3】:

    你可能想使用类似merge():

    merge(df1, df2, by=c("descripcion_cuenta_N2", "anualidad"))
    

    在 SQL 术语中,您试图将 descripcion_cuenta_N2anualidad 列上的两个表连接在一起(可能是两者)。

    【讨论】:

      猜你喜欢
      • 2014-04-12
      • 1970-01-01
      • 1970-01-01
      • 2019-02-27
      • 1970-01-01
      • 2015-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多