2015-12-08 4 views
1

После слияния двух наборов данных у меня есть данные с 300 переменными (некоторые переменные заканчиваются на .x, некоторые заканчиваются на .y и некоторые без каких-либо .x и .y). Как я могу привести все переменные, которые не заканчиваются на .x и .y до первых 100 столбцов набора данных. Кроме того, я хочу, чтобы col 101 был организован как (day.x, day.y, city.x, city.y, number.x, number.y и т. Д.). То есть, переменные с одинаковым именем, например город, но с разным расширением, смежны/рядом друг с другом. Например:Переупорядочение переменных

city.y<- c(1,2,3,5,5,7,7,NA,NA,3,4,5) 
B<-c(3,4,5,6,1,2,7,6,7,NA,NA,6) 
number.x<-c(1,2,3,4,5,6,7,NA,NA,5,5,6) 
day.x<-c(1,3,4,5,6,7,8,1,NA,3,5,3) 
Z<-c(1,2,3,4,5,6,7,NA,NA,5,5,6) 
day.y<-c(4,5,6,7,8,7,8,1,2,3,5,NA) 
number.y<-c(3,4,5,6,1,2,7,6,7,NA,NA,6) 
school.x<-c("a","b","b","c","n","f","h","NA","F","G","z","h") 
S<-c(5,2,3,4,5,6,5,NA,NA,5,6,6) 
school.y<-c("a","b","b","c","m","g","h","NA","NA","G","H","T") 
city.x<- c(1,2,3,7,5,8,7,5,6,7,5,1) 
df<- data.frame(city.y,B,number.x,day.x,Z,day.y,number.y,school.x,S,school.y,city.x) 

Я хочу, чтобы изменить порядок переменных в следующем формате: B, S, Z, city.x, city.y, number.x, number.y, day.x, day.y и ...

ответ

3

Добавьте одну колонку, чтобы создать более общий случай использования:

df$ZZZZZ = 1:6 

Затем загрузите dplyr пакет (для цепным оператора %>% и функции select):

library(dplyr) 

Сортировка получит каждый суб-группировки столбцов в правильном относительном порядке:

names(df) = sort(names(df)) 

Теперь использовать регулярное выражение -matches("\\.[xy]$"), чтобы захватить все столбцы без «.x» или «.y» в конце и поместите эти столбцы в начале. Затем поместите все остальные столбцы после них.

df = df %>% select(-matches("\\.[xy]$"), everything()) 

df 

    A B C ZZZZZ city.x city.y day.x day.y number.x number.y school.x school.y 
1 1 3 1  1  1  1  4  3  a  5  a  1 
2 2 4 2  2  3  2  5  4  b  2  b  2 
... 
11 4 NA 5  5  5  5  5 NA  z  6  H  5 
12 5 6 6  6  3  6 NA  6  h  6  T  1 

Если вы хотите, вы также можете установить собственные суффиксы в merge функции (а не «.x» по умолчанию и «.y»), как это:

merge(df1, df2, by="col", suffixes=c("_df1", "_df2")) 

Если вы что вам, конечно, также потребуется настроить регулярное выражение, которое переупорядочивает столбцы.

2

Это должно сделать это

extCols <- grepl("\\.", colnames(df)) 
df[, c(colnames(df)[(!extCols)], 
    sort(colnames(df)[extCols]))] 
Смежные вопросы