向下移动R中数据框中的列

时间:2017-08-13 00:07:58

标签: r dataframe

假设我有下一个数据框:

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个步骤)。

谢谢!

4 个答案:

答案 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)

事情要点:

  • 在代码的第一行中需要注意的重点是需要创建具有适当行数的表
  • 调用不存在的列将创建一个具有该名称的列
  • 删除R中的列应该像这样df2 $ col&lt; - NULL

答案 2 :(得分:1)

以下是使用dplyrreshape2的方法 - 这假设所有列的长度都相同。

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