使用R对大型数据帧中的列进行重新排序的便捷方法

时间:2019-09-26 01:39:10

标签: r dataframe

此问题与大型数据框中的列重新排序有关,例如,约有800列。数据框在每个ID的不同日期之前有许多列名称(即第一列)。类似的问题会在线出现(例如Reordering columns in data frame once againReordering columns in large data frame),但其具体内容不适合我的情况。数据集的示例是

df <-
structure(
list(
  id = c(1L, 2L, 3L, 4L,5L),
  date1 = c("1/4/2004", "3/8/2004", "NA", "13/10/2004","11/3/2003"),
  ax=c(1,2,1,"NA",5),
  am=c(1,0,1,0,0),
  aq=c(0,0,1,1,1),
  date2 = c("8/6/2002", "11/5/2004", "3/5/2004", 
"25/11/2004","21/1/2004"),
  bx=c(3,2,6,1,5),
  bm=c(1,1,0,1,1),
  bq=c(1,0,1,0,0),
  date3=c("23/6/2006", "24/12/2006", "18/2/2006", "NA","NA"),
  cx=c(1,2,4,1,0),
  cm=c(1,1,0,1,1),
  cq=c(1,0,1,0,0)
 ),
.Names = c("id", 
"date1","ax","am","aq","date2","bx","bm","bq","date3","cx","cm","cq"),
class = "data.frame",
row.names = c(NA,-5L)
)

我想对列进行重新排序,使我们有“ am”,“ aq”,“ ax”; date1之后的“ bm”,“ bq”,“ bx”和“ cm”,“ cq”,“ cx”; date2和date3分别。对于这个小场景示例,我尝试了

df1<-df[,c(1,2,4,5,3,6,8,9,7,10,12,13,11)]

此代码效果很好,并在下面产生了预期的结果

df1
  id      date1 am aq ax      date2 bm bq bx      date3 cm cq cx
1  1   1/4/2004  1  0  1   8/6/2002  1  1  3  23/6/2006  1  1  1
2  2   3/8/2004  0  0  2  11/5/2004  1  0  2 24/12/2006  1  0  2
3  3         NA  1  1  1   3/5/2004  0  1  6  18/2/2006  0  1  4
4  4 13/10/2004  0  1 NA 25/11/2004  1  0  1         NA  1  0  1
5  5  11/3/2003  0  1  5  21/1/2004  1  0  5         NA  1  0  0

但是,我正在寻找一个非常方便的代码,这些代码在大数据上很容易。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

如果您的完整数据遵循您所概述的模式,则可以像这样回收位置调整向量:

System.out.println("On January " + (N) + ", The Sales Tax will be " + (st / 100) * Item);

说明:

模式是保持日期不变,将第二和第三列向前移动一列,将第四列向后移动两列。我们可以创建一个向量:

df[c(1, (2:ncol(df) + c(0,1,1,-2)))]

  id      date1 am aq ax      date2 bm bq bx      date3 cm cq cx
1  1   1/4/2004  1  0  1   8/6/2002  1  1  3  23/6/2006  1  1  1
2  2   3/8/2004  0  0  2  11/5/2004  1  0  2 24/12/2006  1  0  2
3  3         NA  1  1  1   3/5/2004  0  1  6  18/2/2006  0  1  4
4  4 13/10/2004  0  1 NA 25/11/2004  1  0  1         NA  1  0  1
5  5  11/3/2003  0  1  5  21/1/2004  1  0  5         NA  1  0  0

由于R回收较短的向量以匹配较长的向量的长度,我们可以轻松地将其应用于从位置2到数据帧adj.pattern <- c(0,1,1,-2) 中的列数的列位置索引,这得出

2:ncol(df)

然后,我们使用此索引对数据帧进行排序(在ID列的开头添加col.index <- 2:ncol(df) + adj.pattern col.index [1] 2 4 5 3 6 8 9 7 10 12 13 11

1

答案 1 :(得分:1)

如果您要固定iddate列,并根据名称将sort中的其余列保持不变,我们可以

#1:ncol(df)
all_cols <- seq_len(ncol(df))
#Get indices of fixed columns
fixed_columns <- c(1, grep("date", names(df)))
#Get the name of columns apart from fixed ones
cols <- names(df)[-fixed_columns]
#Sort and match them and update the new order in all_cols
all_cols[-fixed_columns] <- match(sort(cols), names(df))
df[all_cols]

#  id      date1 am aq ax      date2 bm bq bx      date3 cm cq cx
#1  1   1/4/2004  1  0  1   8/6/2002  1  1  3  23/6/2006  1  1  1
#2  2   3/8/2004  0  0  2  11/5/2004  1  0  2 24/12/2006  1  0  2
#3  3         NA  1  1  1   3/5/2004  0  1  6  18/2/2006  0  1  4
#4  4 13/10/2004  0  1 NA 25/11/2004  1  0  1         NA  1  0  1
#5  5  11/3/2003  0  1  5  21/1/2004  1  0  5         NA  1  0  0