此问题与大型数据框中的列重新排序有关,例如,约有800列。数据框在每个ID的不同日期之前有许多列名称(即第一列)。类似的问题会在线出现(例如Reordering columns in data frame once again和Reordering 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
但是,我正在寻找一个非常方便的代码,这些代码在大数据上很容易。任何帮助将不胜感激。
答案 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)
如果您要固定id
和date
列,并根据名称将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