【问题标题】:how to rename a subset of columns in multiple datasets with r in the form of a loop如何以循环的形式用 r 重命名多个数据集中的列子集
【发布时间】:2016-12-15 23:26:30
【问题描述】:

我知道以前有人问过这个问题,但我无法让它为我工作,我发誓我尝试了很多方法来做到这一点,从 for file in loops 到 lapply。 我有表格,我想替换现在采用以下格式的第 2 到 7 列标题:“X1”、“X2”、“X3”、“X4”、“X5”、“X6”、“X7” ” 分为“王国”、“门”、“类”、“目”、“科”、“属”、“种”。

每个表的行数和列数都不相同。

我的 31 张桌子是这样列出的:

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

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

当我第一次尝试时,我选择了 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") 

}

我明白了: 名称错误(step4[i])[2:8]

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 的解决方案,但也无法弄清楚.. 有人能帮帮我吗...

【问题讨论】:

  • 看起来step4 是尚未读入 R 的文件名的字符向量。(除非您省略读取文件并将文件列表分配给同一对象的代码。 ) 字符向量没有列名 - 您必须先将它们作为数据帧读入。
  • 另外,请不要使用rstudio 标签,除非您的问题是关于代码编辑器 RStudio(如果您对正在编写的电子邮件有语法问题,您不会使用 @ 987654330@标签)。
  • 嗨,我用这个: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,它会让事情变得混乱和困难。取而代之的是use a list of data frames
  • 哦,很高兴知道。我是 R 语言的新手,所以任何建议都会有所帮助。我避免使用数据框的原因是因为我不知道每个表的行数和列数,并且它们之间确实发生了变化。虽然,我知道第一列(1-8)总是相同的......对我来说这似乎是一个问题,因为你似乎必须在数据框命令中给出表格的“大小”,或者我是完全误解了它。?

标签: r rename


【解决方案1】:

使用您的 step4 字符向量作为@Gregor cmets 简单地创建一个数据帧列表。然后,迭代地重命名每个 df 的列,这些列都可以在一个 lapply()anonymous 函数中处理。此外,由于您使用的是制表符分隔的文件,因此您需要通用的 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)
})


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

对于单个 dfs,请考虑 setNames() 单独命名每个文件,并考虑 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)

【讨论】:

  • 嗨,我按照你给我的方式运行了命令行,没有任何警告或错误消息。虽然,列标题保持不变(X1,X2,...),所以它们没有被重命名......为什么
  • 什么命令行?您是否运行了lapply() 函数?如果不清楚,最后的行需要生成 dfList 的 lapply。
  • 这个洞的东西:step4
  • 很有趣,因为它在我的测试端完美运行。我认为您没有提取任何文件。 step4 是空的吗?您当前的工作目录是什么?请与getwd() 联系。这是list.files() 中的默认路径。您可以使用 setwd() 或使用 list.files' path arg 设置它。如果不是,dfList 是否为空?您可能没有真正的制表符分隔符,请尝试将 sep="\t" 更改为纯空格 sep=""
  • 好的。我现在更困惑了;我跑了这个 temp = list.files(path = workingPath, pattern="*_table.tsv") tempp
猜你喜欢
  • 2021-03-16
  • 2020-03-01
  • 2018-12-21
  • 1970-01-01
  • 1970-01-01
  • 2017-11-06
  • 2015-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多