如何将组行附加到数据框中

Posted

技术标签:

【中文标题】如何将组行附加到数据框中【英文标题】:How to append group row into dataframe 【发布时间】:2018-02-13 01:39:37 【问题描述】:

我有这个 df1:

A B C
1 2 3
5 7 9

A B C 是列名。

我有另一个 df2 的一列:

A
1
2
3
4

我想为 df1 的每一列附加 df2,创建这个最终数据框:

A B C 
1 2 3
5 7 9
1 1 1
2 2 2
3 3 3
4 4 4

有可能吗?

【问题讨论】:

【参考方案1】:
data.frame(sapply(df1, c, unlist(df2)), row.names = NULL)
#  A B C
#1 1 2 3
#2 5 7 9
#3 1 1 1
#4 2 2 2
#5 3 3 3
#6 4 4 4

数据

df1 = structure(list(A = c(1L, 5L), B = c(2L, 7L), C = c(3L, 9L)), .Names = c("A", 
"B", "C"), class = "data.frame", row.names = c(NA, -2L))

df2 = structure(list(A = 1:4), .Names = "A", class = "data.frame", row.names = c(NA, 
-4L))

【讨论】:

unlist(df2, use.names = FALSE) 可能比row.names = NULL 更有效【参考方案2】:

我们可以将df2复制df1的列数,取消它的名字,然后rbind它。

rbind(df1, unname(rep(df2, ncol(df1))))
#   A B C
# 1 1 2 3
# 2 5 7 9
# 3 1 1 1
# 4 2 2 2
# 5 3 3 3
# 6 4 4 4

数据:

df1 <- structure(list(A = c(1L, 5L), B = c(2L, 7L), C = c(3L, 9L)), .Names = c("A", 
"B", "C"), class = "data.frame", row.names = c(NA, -2L))
df2 <- structure(list(A = 1:4), .Names = "A", row.names = c(NA, -4L), class = "data.frame")

【讨论】:

unname,是的,这就是我试图让rbind 更轻松地工作的想法。 +1。【参考方案3】:

我们可以使用base R方法

rbind(df1, setNames(as.data.frame(do.call(cbind, rep(list(df2$A), 3))), names(df1)))
#  A B C
#1 1 2 3
#2 5 7 9
#3 1 1 1
#4 2 2 2
#5 3 3 3
#6 4 4 4

数据

df1 <- structure(list(A = c(1L, 5L), B = c(2L, 7L), C = c(3L, 9L)), .Names = c("A", 
"B", "C"), class = "data.frame", row.names = c(NA, -2L))

df2 <- structure(list(A = 1:4), .Names = "A", class = "data.frame",
row.names = c(NA, -4L))

【讨论】:

【参考方案4】:

这是一个带有rbindrepsetNames的基本R方法:

rbind(dat, setNames(data.frame(rep(dat1, ncol(dat))), names(dat)))
  A B C
1 1 2 3
2 5 7 9
3 1 1 1
4 2 2 2
5 3 3 3
6 4 4 4

编辑:原来data.frame 不是必需的:

rbind(dat, setNames(rep(dat1, ncol(dat)), names(dat)))

会起作用的。

数据

dat <- 
structure(list(A = c(1L, 5L), B = c(2L, 7L), C = c(3L, 9L)), .Names = c("A", 
"B", "C"), class = "data.frame", row.names = c(NA, -2L))

dat1 <-
structure(list(A = 1:4), .Names = "A", row.names = c(NA, -4L),
class = "data.frame")

【讨论】:

【参考方案5】:

我只是喜欢 R,这是另一个 Base R 解决方案,但使用 mapply

data.frame(mapply(c, df1, df2))

结果:

  A B C
1 1 2 3
2 5 7 9
3 1 1 1
4 2 2 2
5 3 3 3
6 4 4 4

注意:

不需要像几乎所有其他解决方案一样处理 colnames... 之所以有效的关键是“mapply 为 ... [每个元素] 的值调用 FUN (重新循环到最长的长度...[元素]”(参见 ?mapply)。换句话说,df2$A 被回收到 df1 有多少列。

数据:

df1 = structure(list(A = c(1L, 5L), B = c(2L, 7L), C = c(3L, 9L)), .Names = c("A", 
                                                                               "B", "C"), class = "data.frame", row.names = c(NA, -2L))
df2 = structure(list(A = 1:4), .Names = "A", row.names = c(NA, -4L), class = "data.frame")

【讨论】:

【参考方案6】:

数据:

df1 <- data.frame(A=c(1,5),
                  B=c(2,7),
                  C=c(3,9))
df2 <- data.frame(A=c(1,2,3,4))

解决方案:

df2 <- matrix(rep(df2$A, ncol(df1)), ncol=ncol(df1))
colnames(df2) <- colnames(df1)
rbind(df1,df2)

结果:

  A B C
1 1 2 3
2 5 7 9
3 1 1 1
4 2 2 2
5 3 3 3
6 4 4 4

【讨论】:

【参考方案7】:

来自purrr 的解决方案,它使用map_dfc 循环遍历df1 中的所有列以将所有元素与df2$A 组合。

library(purrr)

map_dfc(df1, ~c(., df2$A))

# A tibble: 6 x 3
      A     B     C
  <int> <int> <int>
1     1     2     3
2     5     7     9
3     1     1     1
4     2     2     2
5     3     3     3
6     4     4     4

数据

df1 <- structure(list(A = c(1L, 5L), B = c(2L, 7L), C = c(3L, 9L)), .Names = c("A", 
                                                                               "B", "C"), class = "data.frame", row.names = c(NA, -2L))

df2 <- structure(list(A = 1:4), .Names = "A", class = "data.frame",
                 row.names = c(NA, -4L))

【讨论】:

【参考方案8】:

类比 @user 出色的 Base R 答案,这里有一个 tidyverse 解决方案:

library(purrr)

map2_df(df1, df2, c)
  A B C
1 1 2 3
2 5 7 9
3 1 1 1
4 2 2 2
5 3 3 3
6 4 4 4

这是我第一次回答这个问题时的其他一些(不太理想的)选项。

library(dplyr)

bind_rows(df1, df2 %>% mutate(B=A, C=A))

或者,如果我们想从 df1 动态获取列数及其名称:

bind_rows(df1,
          df2[,rep(1,ncol(df1))] %>% setNames(names(df1)))

还有一种 Base R 方法:

rbind(df1, setNames(df2[,rep(1,ncol(df1))], names(df1)))

【讨论】:

【参考方案9】:

为了完整起见,这里是data.table 方法,它不需要处理列名:

library(data.table)
setDT(df1)[, lapply(.SD, c, df2$A)]
   A B C
1: 1 2 3
2: 5 7 9
3: 1 1 1
4: 2 2 2
5: 3 3 3
6: 4 4 4

请注意,OP 已将 df2 描述为仅包含一列。

这种方法还有一个基本的 R 版本:

data.frame(lapply(df1, c, df2$A))
  A B C
1 1 2 3
2 5 7 9
3 1 1 1
4 2 2 2
5 3 3 3
6 4 4 4

这类似于d.b's 方法,但不需要处理列名。

【讨论】:

以上是关于如何将组行附加到数据框中的主要内容,如果未能解决你的问题,请参考以下文章

如何将列表项附加到数据框中的特定列?

如何将值列表附加到数据框中的列表列

如何使 R 函数返回多列并将它们附加到数据框中?

无法使用 usermod 将组附加到用户组

如何按 > 日期对一系列日期求和并将它们附加到熊猫新数据框中的新列?

如何在pyspark和sql的一个数据框中应用多个条件并附加到同一个表