如何使用循环形式的r重命名多个数据集中的列子集

时间:2016-08-09 19:21:31

标签: r rename

我知道之前已经问过这个问题,但是我不能让它为我工作,我发誓我尝试了很多方法来做文件循环到lapply。 我有表格,我想要替换现在采用这种格式的列2到7'S标题:“X1”,“X2”,“X3”,“X4”,“X5”,“X6”,“X7 “进入”王国“,”门“,”阶级“,”秩序“,”家庭“,”属“,”物种“。

每个表都没有相同数量的行或列。

我的31个表格如下:

step4 <- list.files(pattern="*.coldrop.tsv")

另外,这是一个''子问题'',我是从第二列开始的,因为RAM不断添加行号(1,2,3,4,5,6 .... n)。如果有人能在这里帮助我,那就太棒了......我需要在所有这些''step4''表格中做到这一点。 这里有一些我想做的“样本”。

当我在尝试fisrt时,我选择了for file in loop选项:

colnames <- c("Kingdom", "Phylum", "Class", "Order", "Family", "Genus", "Species")

以下适用于单个文件

names(Omlo_run11_table.tsv.step1.tsv.step2.tsv.step3.tsv.coldrop.tsv)[2:8] <- c("Kingdom", "Phylum", "Class", "Order", "Family", "Genus", "Species")

i = 1
for(i in 1:length(step4)){
  names(step4[i])[2:8] <- c("Kingdom","Phylum","Class","Order","Family","Genus","Species") 

}

我明白了: 名称错误(步骤4 [i])[2:8]&lt; - c(“王国”,“门”,“班级”,“订单”,:   'names'属性[8]的长度必须与vector [1]

的长度相同
names(get(step4[i]))[names(get(step4[i])) == "X1","X2","X3","X4","X5","X6","X7"] <- c("Kingdom","Phylum","Class","Order","Family","Genus","Species")

我明白了: 名称错误(get(step4 [i]))[names(get(step4 [i]))==“X1”,“X2”,“X3”,:   下标数不正确

for(i in 1:length(step4)){
  nm <- paste0("step4[i]")
  tmp <- get(nm)
  colnames(tmp)[2:8] <- c("Kingdom", "Phylum", "Class", "Order", "Family", "Genus", "Species")
  assign(nm, tmp)
}

我明白了: get(nm)出错:对象'step4 [i]'未找到

lapply (step4, function(df) { colnames(df)[2:length(step4)] <-colnames[1:length(step4)]-1)}

依旧...... 我更喜欢那种类型的文件,但我对lapply选项持开放态度。 我遇到了带有setnames的解决方案,但无法弄清楚.. 可以请有人帮助我......

1 个答案:

答案 0 :(得分:0)

只需使用 step4 字符向量创建数据框列表作为@Gregor评论。然后,迭代地重命名每个df的列,这些列都可以在一个lapply()匿名函数中处理。此外,由于您正在使用制表符分隔文件,您需要通用read.table()函数(其中read.csv是逗号分隔文件的特殊包装器):

step4 <- list.files(path = tsvfilepath, pattern=".*tsv$", full.names = TRUE)

dfList <- lapply(step4, function(i) {
        df <- read.table(i, sep="\t", quote="", header=TRUE, as.is=FALSE)
        names(df)[2:8] <- c("Kingdom","Phylum","Class","Order","Family","Genus","Species") 
        return(df)
})

TSV Files Import with Colnames

此列表可用于各种需求,例如单个数据帧或一个主数据帧。

对于单个dfs,请考虑setNames()为每个dfs命名,并list2env()创建单独的环境对象。下面给出了每个df与其对应文件名相同的名称:

dfList <- setNames(dfList, step4)

list2env(dfList, envir=.GlobalEnv)

对于一个大型主df,您将所有数据帧追加到一起,就会遇到不完整列的挑战。因此,请考虑使用第三方软件包填写dfs中缺少的列:

library(plyr)
rbind.fill(dfList)

library(dplyr)
bind_rows(dfList)

library(data.table)    
rbindlist(dfList, fill=TRUE)