我有一个数据框,需要在每十列中进行合并。例如,我的数据框如下所示:
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来做到这一点。但是鉴于给定的列数,我想尝试以一种更优雅的方式做到这一点。
答案 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