rbind dataframes как вывод встроенной функции - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть такой фрейм данных:

set.seed(10040)
my_data <- data.frame(X.1 = c(188.1,188.2,188.3),
                      ID_1A = runif(3, 13, 15),
                      ID_1B = runif(3, 13, 15),
                      ID_1C = runif(3, 13, 15),
                      X.2 = c(188.1,188.2,188.3),
                      ID_2A = runif(3, 13, 15),
                      ID_2B = runif(3, 13, 15),
                      ID_2C = runif(3, 13, 15),
                      X.3 = c(188.1,188.2,188.3),
                      ID_3A = runif(3, 13, 15),
                      ID_3B = runif(3, 13, 15),
                      ID_3C = runif(3, 13, 15))

С гораздо большим количеством строк и столбцов.Используя функции gather и rbind, я хотел бы создать функцию, которая автоматически изменяет структуру фрейма данных, чтобы получить всю информацию в каждом необработанном виде.В конце концов, каждые 4 столбца мне нужно использовать gather для изменения формы данных, а затем связать все строки из этих «подкадров».

Пока у меня есть это:

my_function <- function(data, col_min, col_max){

  output <- data[,c(col_min:col_max)]  %>%
    as.data.frame() %>% 
    gather(treatment,intensite,substring(colnames(df[col_min+1]), 1, 7):substring(colnames(df[col_max]), 1, 7)) %>%
    `colnames<-`(c('X','ID','value'))

  return(rbind(output))

}

Я могу запустить функцию без проблем для первого субкадра:

clean <- my_function(data = my_data, col_min = 1, col_max = 4)

Но я не могу найти способ добавить другие субкадры.

Я пытался запустить эти:

clean <- my_function(data = my_data,
           col_min = seq(from = 1, to = 49, by = 4),
           col_max = seq(from = 5, to = 52, by = 4))

и

for(i in seq(from = 1, to = 49, by = 4)){

  output = my_funtion(data = my_data,
                     col_min = i,
                     col_max = i+3)
  clean = rbind(output)

}

Но я получаю сообщения об ошибках, потому что rbind не нравится множественные значения для col_min и col_max.

Есть кое-что, чего мне не хватает здесь, и я предполагаю, что ответ в семье apply за то, чтобы заставить rbind работать, но я не нашел этого.

1 Ответ

0 голосов
/ 07 марта 2019

Коллега помог мне решить мои проблемы: я мог либо использовать функцию lapply, либо построить цикл for следующим образом:

Опция 1:

    fun_import <- function(data){

      cols <- ncol(data)
      tables <- lapply(seq(1, cols-3, 4), function(i){
        data[, i:(i+3)]  %>% 
          gather(treatment, intensite,substring(colnames(data[i+1]), 1, 7):substring(colnames(data[i+3]), 1, 7)) %>% 
          `colnames<-`(c('X','ID','value'))
      })

      return(do.call(rbind, tables))
    }

Затем выполнить:

output <- fun_import(my_data)

Вариант 2:

fun_import <- function(data){

  cols <- ncol(data)
  seq_col <- seq(1, cols-3, 4)
  n <- length(seq_col)
  df <- vector("list", n)
  j = 1

  for (i in seq_col){

    df[[j]] <- data[, i:(i+3)]  %>% 
      gather(treatment, intensite,substring(colnames(data[i+1]), 1, 7):substring(colnames(data[i+3]), 1, 7)) %>% 
      `colnames<-`(c('X','ID','value'))
    j = j + 1
  }

return(do.call(rbind, df))
}

Затем выполните:

output <- fun_import(my_data)
...