如何在 R 中组合两个不同长度的数据帧?
How can I combine two dataframes with different lengths in R?
我有两个数据框,例如:
和
我想要这样的东西:
以下是可再现性的数据帧:
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:我知道一旦数据帧在一起我就可以删除重复的行。
您可能想使用 merge()
:
merge(df1, df2, by=c("descripcion_cuenta_N2", "anualidad"))
在 SQL 行话中,您试图将 descripcion_cuenta_N2
和 anualidad
列(可能是两者)上的两个表连接在一起。
尝试在 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?
我有两个数据框,例如:
和
我想要这样的东西:
以下是可再现性的数据帧:
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:我知道一旦数据帧在一起我就可以删除重复的行。
您可能想使用 merge()
:
merge(df1, df2, by=c("descripcion_cuenta_N2", "anualidad"))
在 SQL 行话中,您试图将 descripcion_cuenta_N2
和 anualidad
列(可能是两者)上的两个表连接在一起。
尝试在 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?