我正在寻找有关此主题的帮助,但我认为我搜索的字词无法为我提供解决方案。
我正在寻找一个函数来遍历数据框,并通过向下移动每一列并将其作为cbind
函数的第一部分将两行转换为一行。
我最初有两行数据,但我想到的唯一方法是将它们组合成一个数据框并创建一个for循环来转置每一列并再次运行cbind
。
我拥有的是:
col1 col2 col3 col4
[1,] a1 a2 a3 a4
[2,] b1 b2 b3 b4
我希望有这样的东西,如果可能的话,在列名中附加一个识别前缀;
a.col1 b.col1 a.col2 b.col2 a.col3 b.col3 a.col4 b.col4
[1,] a1 b1 a2 b2 a3 b3 a4 b4
如果有人能告诉我一个有用的包装或功能,我将非常感激!
答案 0 :(得分:0)
以下是dcast
library(reshape2)
df$indx <- 1
res <- dcast(transform(melt(df, id.var='indx'), indx2=letters[1:2]),
indx~indx2+variable, value.var='value')[-1]
res1 <- res[order(sub('^.*_', '', names(res)))]
res1
# a_col1 b_col1 a_col2 b_col2 a_col3 b_col3 a_col4 b_col4
#1 a1 b1 a2 b2 a3 b3 a4 b4
或使用dplyr/tidyr
library(dplyr)
library(tidyr)
gather(df, Var, Val, -indx) %>%
mutate(indx2=rep(letters[1:2], length.out=n()))%>%
unite(indx2Var, indx2,Var, sep=".") %>%
spread(indx2Var, Val)
# indx a.col1 a.col2 a.col3 a.col4 b.col1 b.col2 b.col3 b.col4
#1 1 a1 a2 a3 a4 b1 b2 b3 b4
或者
as.data.frame.list(c(as.matrix(df)))
您可以使用setNames
和paste
更改column names
as.data.frame.list(setNames(c(as.matrix(df)),
paste0(letters[1:2], '.', rep(paste0('col',1:4),each=2))))
# a.col1 b.col1 a.col2 b.col2 a.col3 b.col3 a.col4 b.col4
#1 a1 b1 a2 b2 a3 b3 a4 b4
或
df2 <- cbind(df[1,], df[2,])
df2[order(colnames(df2))] #and change the column names
df <- structure(list(col1 = c("a1", "b1"), col2 = c("a2", "b2"),
col3 = c("a3", "b3"), col4 = c("a4", "b4")), .Names = c("col1", "col2",
"col3", "col4"), class = "data.frame", row.names = c(NA, -2L))