R函数来cbind各个列的转置
R function to cbind the transpose of individual columns
我正在寻求有关此主题的帮助,但我认为我正在搜索的词无法为我提供解决方案。
我正在寻找一个函数来遍历数据框并将两行转换为一行,方法是向下移动每一列并将其用作 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
如果有人能告诉我有用的包或功能,我将不胜感激!
这里有一个选项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))
我正在寻求有关此主题的帮助,但我认为我正在搜索的词无法为我提供解决方案。
我正在寻找一个函数来遍历数据框并将两行转换为一行,方法是向下移动每一列并将其用作 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
如果有人能告诉我有用的包或功能,我将不胜感激!
这里有一个选项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))