rbind数据帧作为内置函数的输出

时间:2019-02-22 14:10:42

标签: function dataframe reshape

我有一个像这样的数据框:

X

具有更多的行和列。我想使用函数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,来构建一个函数,该函数可以自动重塑数据框,以获取每个原始数据中的所有信息。最后,我需要每隔4列使用rbind重新调整数据的形状,然后绑定这些“子数据帧”中的所有行。

到目前为止,我有这个:

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) } 不喜欢rbindcol_min的多个值。

在这里我缺少一些东西,我假设答案是在col_max家庭中完成apply工作的,但是我没有找到答案。

1 个答案:

答案 0 :(得分:0)

一位同事帮助我解决了我的问题:我可以使用lapply函数或建立如下的f​​or循环:

选项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)