Для L oop изменить порядок столбцов в R - PullRequest
1 голос
/ 15 января 2020

Я пытаюсь изменить порядок столбцов в R, используя a для l oop, поскольку диапазон столбцов должен быть динамическим c. Кто-нибудь знает, чего не хватает в моем коде?

    Group <- c("A","B","C","D")
    Attrib1 <- c("x","y","x","z")
    Attrib2 <- c("q","w","u","i")
    Day1A <- c(5,4,6,3)
    Day2A <- c(6,5,7,4)
    Day3A <- c(9,8,10,7)
    Day1B <- c(4,3,5,2)
    Day2B <- c(3,2,4,1)
    Day3B <- c(2,1,3,0)

    df <- data.frame(Group, Attrib1,Attrib2,Day1A,Day2A,Day3A,Day1B,Day2B,Day3B)

    day_count <- 3

    for(i in 4:ncol(df)) {
      if (i == day_count+3) break
      df[c(i,day_count+i)]
     }

Вот мой желаемый результат:

    df <- data.frame(Group, Attrib1,Attrib2,Day1A,Day1B,Day2A,Day2B,Day3A,Day3B)

Ответы [ 2 ]

1 голос
/ 15 января 2020

Опция с select

library(dplyr)
library(stringr)
df %>% 
   select(Group, starts_with('Attrib'), 
      names(.)[-(1:3)][order(str_remove_all(names(.)[-(1:3)], '\\D+'))])
1 голос
/ 15 января 2020

Итак, теоретически вы можете просто выполнить сортировку (colnames (df) [4: ncol (df)]), чтобы получить это, но это становится сложно, когда вы говорите Day1A..Day10A..Day20A

Ниже приведен быстрый обходной путь, чтобы получить цифры и алфавиты:

COLS = colnames(df)[4:ncol(df)]
day_no = as.numeric(gsub("[^0-9]","",COLS))
day_letter = gsub("Day[0-9]*","",COLS)
o = order(day_no,day_letter)

Чтобы получить окончательный фрейм данных:

df[,c(colnames(df)[1:3],COLS[o])]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...