合并R中的列系列

时间:2018-12-07 00:33:54

标签: r lapply

我有一个数据框,需要在每十列中进行合并。例如,我的数据框如下所示:

V1    V2    V3    V4    V5    V6
A     B     C     D     E     F

我想要的是:

first second third
AD    BE     CF

为此,我一直在尝试使用lapply和自定义函数:

col_unite <- c(c('V1', 'V4', 'first'), c('V2', 'V5', 'second'), c('V3', 'V6', 'third'))
#function that combines columns and gives a new name
unite_cols <- function(dataframe, col_list){
  dataframe[[col_list[3]]] <- paste0(dataframe[[col_list[1]]], ', ', 
  dataframe[[col_list[2]]])
  dataframe
}

new_df <- lapply(col_unite, function(x){
   df <- unite_cols(orig_df, x)
   # df[x[3]] <- paste0(test[x[1]], ', ', test[x[2]]) # a different attempt
   return(df)
})

我知道我可以用一串unite语句来做到这一点,或者也许有一种方法可以通过循环和unite来做到这一点。但是鉴于给定的列数,我想尝试以一种更优雅的方式做到这一点。

3 个答案:

答案 0 :(得分:3)

这样的事情怎么样

n <- 4
rbind.data.frame(apply(matrix(df, nrow = n - 1), 1, paste0, collapse = ""))
#   X.AD. X.BE. X.CF.
#1    AD    BE    CF

在这里,我们通过将n = 4强制转换为data.frame行,matrix行,n - 1行并将{ {1}}回到paste0

剩下的唯一一件事就是提出合适的列名。


样本数据

matrix

答案 1 :(得分:2)

首先,我定义数据框。

df <- read.table(text = "V1    V2    V3    V4    V5    V6
A     B     C     D     E     F", header = TRUE, colClasses = "character")

然后,我使用lapply进行遍历,并将paste的每列与第3列重叠,然后将结果列表重铸为数据框。

lapply(1:(ncol(df)/2), function(x)paste0(df[,c(x,x+3)], collapse = "")) %>% 
  data.frame 

管道(%>%)需要使用dplyr包。

#    X.AD. X.BE. X.CF.
# 1    AD    BE    CF

编辑

或者,我创建一个要组合的成对列名称的列表。否则,几乎是相同的方法。

MyList <- list(c("V1", "V4"), c("V2", "V5"), c("V3", "V6"))

lapply(MyList, function(x)paste0(df[,x], collapse = "")) %>% 
    data.frame

#    X.AD. X.BE. X.CF.
# 1    AD    BE    CF

答案 2 :(得分:2)

1)将数据框转换为3d数组,在其前两个维度上应用paste,得到矩阵m,然后转换回数据框:

a <- array(as.matrix(d), c(nrow(d), 3, ncol(d)/3))
m <- apply(a, 1:2, paste, collapse = "") 
as.data.frame(m, stringsAsFactors = FALSE)

给予

  V1 V2 V3
1 ad be cf
2 gj hk il

2)以下是如果我们有一个分组向量g的另一种方法。这不需要均匀分布的列,因为我们可以任意定义g

g <- rep(1:3, length = ncol(d))
Paste0 <- function(x) do.call("mapply", c(paste0, x))
as.data.frame(lapply(split(as.list(d), g), Paste0), stringsAsFactors = FALSE)

给予:

   a  b  c
a ad be cf
g gj hk il

注意

我们使用2x6数据帧作为测试输入:

d <- structure(list(V1 = c("a", "g"), V2 = c("b", "h"), V3 = c("c", 
  "i"), V4 = c("d", "j"), V5 = c("e", "k"), V6 = c("f", "l")), 
  class = "data.frame", row.names = c(NA, -2L))

如下所示:

> d
  V1 V2 V3 V4 V5 V6
1  a  b  c  d  e  f
2  g  h  i  j  k  l