我有一个像这样的数据框:
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)
}
不喜欢rbind
和col_min
的多个值。
在这里我缺少一些东西,我假设答案是在col_max
家庭中完成apply
工作的,但是我没有找到答案。
答案 0 :(得分:0)
一位同事帮助我解决了我的问题:我可以使用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)