假设我有下一个数据框:
df<-data.frame(step1=c(1,2,3,4),step2=c(5,6,7,8),step3=c(9,10,11,12),step4=c(13,14,15,16))
step1 step2 step3 step4
1 1 5 9 13
2 2 6 10 14
3 3 7 11 15
4 4 8 12 16
我必须做的事情如下:
df2<-data.frame(col1=c(1,2,3,4,5,6,7,8,9,10,11,12),col2=c(5,6,7,8,9,10,11,12,13,14,15,16))
col1 col2
1 1 5
2 2 6
3 3 7
4 4 8
5 5 9
6 6 10
7 7 11
8 8 12
9 9 13
10 10 14
11 11 15
12 12 16
我该怎么做?考虑可以包括更多步骤(例如,20个步骤)。
谢谢!
答案 0 :(得分:1)
我们可以设计一个功能来完成这个任务。 df_final
是最终输出。请注意,bin
是一个参数,用户可以指定要一起转换的列数。
# A function to conduct data transformation
trans_fun <- function(df, bin = 3){
# Calculate the number of new columns
new_ncol <- (ncol(df) - bin) + 1
# Create a list to store all data frames
df_list <- lapply(1:new_ncol, function(num){
return(df[, num:(num + bin - 1)])
})
# Convert each data frame to a vector
dt_list2 <- lapply(df_list, unlist)
# Convert dt_list2 to data frame
df_final <- as.data.frame(dt_list2)
# Set the column and row names of df_final
colnames(df_final) <- paste0("col", 1:new_ncol)
rownames(df_final) <- 1:nrow(df_final)
return(df_final)
}
# Apply the trans_fun
df_final <- trans_fun(df)
df_final
col1 col2
1 1 5
2 2 6
3 3 7
4 4 8
5 5 9
6 6 10
7 7 11
8 8 12
9 9 13
10 10 14
11 11 15
12 12 16
答案 1 :(得分:1)
这应该做的工作:
df2 <- data.frame(col1 = 1:(length(df$step1) + length(df$step2)))
df2$col1 <- c(df$step1, df$step2, df$step3)
df2$col2 <- c(df$step2, df$step3, df$step4)
事情要点:
答案 2 :(得分:1)
以下是使用dplyr
和reshape2
的方法 - 这假设所有列的长度都相同。
library(dplyr)
library(reshape2)
从数据框中删除最后一列
df[,1:ncol(df)-1]%>%
melt() %>%
dplyr::select(col1=value) -> col1
从数据框中删除第一列
df %>%
dplyr::select(-step1) %>%
melt() %>%
dplyr::select(col2=value) -> col2
合并数据框
bind_cols(col1, col2)
答案 3 :(得分:1)
你不只是想做:
df2 <- data.frame(col1 = unlist(df[,-nrow(df)]),
col2 = unlist(df[,-1]))
rownames(df2) <- NULL
df2
col1 col2 1 1 5 2 2 6 3 3 7 4 4 8 5 5 9 6 6 10 7 7 11 8 8 12 9 9 13 10 10 14 11 11 15 12 12 16