有没有办法以 rbind 方式堆叠数据帧,其中 R 中有一个不同的列名

Is there a way to stack dataframes in an rbind fashion where there is a single different column name in R

提问人:TheBoomerang 提问时间:5/4/2023 最后编辑:ThomasIsCodingTheBoomerang 更新时间:5/4/2023 访问量:46

问:

有没有办法以逐行方式堆叠数据帧。请考虑以下代码

motors <- c("audi", "honda", "ford")
age <- c(1, 2, 3)

motors1 <- motors
age1 <- c(2, 3, 1)

dat1 <- data.frame(motors, age)
dat2 <- data.frame(motors1, age1)

我想在 dat1 和 dat2 上执行 rbind() 类型的操作,但这不起作用,因为 dat1 中的“motors”列和 dat2 中的“motors2”是不同的。

有没有办法执行此操作,将两个数据帧合并为 1,因此仍然有 2 列数据,但有 8 行数据(包括列名)。

R 数据帧 rbind

评论


答:

3赞 GKi 5/4/2023 #1

将 的名称设置为 的 ,并在其中包括 dat1 和 2 的名称。dat2dat1

rbind(rbind(names(dat1), dat1), setNames(rbind(names(dat2), dat2), names(dat1)))
#   motors  age
#1  motors  age
#2    audi    1
#3   honda    2
#4    ford    3
#5 motors1 age1
#6    audi    2
#7   honda    3
#8    ford    1

如果只是为了堆叠它而不包含 colname,要么重命名 colnames,要么使用 in 并将其转换为 with .cMapdata.framelist2DF

rbind(dat1, setNames(dat2, names(dat1)))
#  motors age
#1   audi   1
#2  honda   2
#3   ford   3
#4   audi   2
#5  honda   3
#6   ford   1

list2DF(Map(c, dat1, dat2))
#  motors age
#1   audi   1
#2  honda   2
#3   ford   3
#4   audi   2
#5  honda   3
#6   ford   1

还可以查看具有不同列名称的 rbind 数据帧让 rbind 忽略列名的最简单方法

1赞 jpsmith 5/4/2023 #2

我用于在以下情况下快速合并数据:mapply

mapply(c, dat1, dat2)

虽然它返回一个矩阵:

     motors  age
[1,] "audi"  "1"
[2,] "honda" "2"
[3,] "ford"  "3"
[4,] "audi"  "2"
[5,] "honda" "3"
[6,] "ford"  "1"

这对我来说通常很好,但如果我确实需要不同的数据类型(字符、数字),我会使用:data.table::rbindlist()

data.table::rbindlist(list(dat1, dat2))

   motors age
1:   audi   1
2:  honda   2
3:   ford   3
4:   audi   2
5:  honda   3
6:   ford   1