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

如何使用r以循环的形式重命名多个数据集中的列子集,r,rename,R,Rename,我知道以前有人问过这个问题,但我不能让它为我工作,我发誓我尝试了很多方法,从for file in循环到lappy。 我有一些表格,我想将第2列到第7列的标题替换为“王国”、“门”、“类”、“目”、“科”、“属”、“种”,这些标题现在是这种格式:“X1”、“X2”、“X3”、“X4”、“X5”、“X6”、“X7” 每个表的行数和列数不同 我的31张表格如下所示: step4 <- list.files(pattern="*.coldrop.tsv") step4只需使用step4字符向量

我知道以前有人问过这个问题,但我不能让它为我工作,我发誓我尝试了很多方法,从for file in循环到lappy。 我有一些表格,我想将第2列到第7列的标题替换为“王国”、“门”、“类”、“目”、“科”、“属”、“种”,这些标题现在是这种格式:“X1”、“X2”、“X3”、“X4”、“X5”、“X6”、“X7”

每个表的行数和列数不同

我的31张表格如下所示:

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

step4只需使用step4字符向量@Gregor comments创建一个数据帧列表。然后,以迭代方式重命名每个df的列,所有这些列都可以在一个
lappy()
匿名函数中处理。另外,由于您使用的是制表符分隔的文件,因此需要通用的
read.table()
函数(其中
read.csv
是逗号分隔文件的特殊包装):

对于一个大型主df,您将所有数据帧附加在一起,您将面临不完整列的挑战。因此,考虑第三方包来填充DFS中缺失的列:

library(plyr)
rbind.fill(dfList)

library(dplyr)
bind_rows(dfList)

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

只需使用step4字符向量@Gregor comments创建一个数据帧列表。然后,以迭代方式重命名每个df的列,所有这些列都可以在一个
lappy()
匿名函数中处理。另外,由于您使用的是制表符分隔的文件,因此需要通用的
read.table()
函数(其中
read.csv
是逗号分隔文件的特殊包装):

对于一个大型主df,您将所有数据帧附加在一起,您将面临不完整列的挑战。因此,考虑第三方包来填充DFS中缺失的列:

library(plyr)
rbind.fill(dfList)

library(dplyr)
bind_rows(dfList)

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


看起来
step4
是一个尚未读入R的文件名的字符向量(除非您省略了读入文件并将文件列表分配给同一对象的代码)。字符向量没有列名-您必须先将其作为数据帧读入。此外,请不要使用
rstudio
标签,除非您的问题是关于代码编辑器rstudio的(如果您对正在编写的电子邮件有语法问题,您不会使用
gmail
标签)。您好,我使用这个:step4=list.files(pattern=“*.coldrop.tsv”)for(I in 1:length(step4))assign(step4[I],read.csv(step4[I],sep=“\t”,quote=“”,header=TRUE,as.is=FALSE))。对Rstudio感到抱歉!你不应该使用
assign
,这会让事情变得混乱和困难。相反,哦,很高兴知道。我是R语言的新手,所以任何建议都可能有帮助。我之所以避免使用数据帧,是因为我不知道每个表的行数和列数,而且它们之间确实会发生变化。尽管如此,我知道第一列(1-8)总是一样的……对我来说,这似乎是一个问题,因为您似乎必须在dataframe命令中给出表的“大小”,或者我完全误解了它。看起来
step4
是未读入R的文件名的字符向量。(除非您省略读取中的文件并将文件列表分配给同一对象的代码。)字符向量没有列名-您必须先将它们作为数据帧读入。此外,除非您的问题是关于代码编辑器rstudio,否则请不要使用
rstudio
标记(如果你写的电子邮件有语法问题,你就不会使用
gmail
标签)。嗨,我用这个:step4=list.files(pattern=“*.coldrop.tsv”)for(I in 1:length(step4)assign(step4[I],read.csv(step4[I],sep=“\t”,quote=“,header=TRUE,as.is=FALSE))。关于Rstudio,很抱歉!你不应该使用
assign
,这会使事情变得混乱和困难。相反。哦,很高兴知道。我是R语言的新手,所以任何建议都可能会有所帮助。我避免使用数据帧的原因是因为我不知道每个表的行数和列数,并且它们之间会发生变化。不过,我知道第一列(1-8)总是相同的…对我来说,这似乎是一个问题,因为您似乎必须在dataframe命令中给出表的“大小”,或者我完全误解了它。您好,我按照您给出的方式运行了命令行,没有任何警告或错误消息。不过,列标题保持不变(X1,X2,…)所以它们没有被重命名…为什么命令行是什么?你运行了
lappy()吗
函数?如果不清楚,末尾的行需要生成dfList的lappy。这个洞:step4很有趣,因为它在我的测试端工作得很好。我想你没有拉入任何文件。
step4
是空的吗?你当前的工作目录是什么?请检查
getwd()
。这是
list.files()
中的默认路径。您可以使用
setwd()
设置它,或者使用list.files的
path
arg。如果不是,dfList是空的吗?您可能没有真正的制表符分隔符,请尝试将
sep=“\t”
更改为空白,
sep=“
。好的。我现在更困惑了;我运行了这个temp=list.files(path=workingPath,pattern=“*_table.tsv”)tempp您好,我按照您给我的方式运行了命令行,没有任何警告或错误消息。尽管如此,列标题保持不变(X1,X2,…),因此它们没有被重命名…为什么命令行?您运行了
lappy()
函数?如果不清楚,末尾的行需要生成dfList的lappy。这个洞:step4很有趣,因为它在我的测试端工作得很好。我想你没有拉入任何文件。
step4
是空的吗?你当前的工作目录是什么?请检查
getwd()
。这是
list.files()
中的默认路径。您可以使用
setwd()
设置它,或者使用list.files的
path
arg。如果不是,dfList是空的吗?您可能没有真正的制表符分隔符,请尝试将
sep=“\t”
更改为空白,
sep=“
。好的。我现在更困惑了;
names(get(step4[i]))[names(get(step4[i])) == "X1","X2","X3","X4","X5","X6","X7"] <- c("Kingdom","Phylum","Class","Order","Family","Genus","Species")
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)
}
lapply (step4, function(df) { colnames(df)[2:length(step4)] <-colnames[1:length(step4)]-1)}
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)
})
dfList <- setNames(dfList, step4)

list2env(dfList, envir=.GlobalEnv)
library(plyr)
rbind.fill(dfList)

library(dplyr)
bind_rows(dfList)

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