0

这应该很容易,但我做不到。我有很多文件,每个文件都以物种名称命名。我还有一个数据框,其中每一列都以物种名称命名。我只想从数据框中提取列,并在更改列名之后将该列与相应的物种文件结合起来,让说“常见”可能在一个循环中,以便稍后比较所有物种。

自由度:

ID  Tilia_americana Fraxinus_americana  Ulmus_americana
1   23  32  32
2   21  34  35
3   20  33  32
4   19  33  36
5   23  23  34
6   22  34  37

抱歉,之前没有具体说明。如您所见,列名是物种名称,此外,我还有三个带有物种名称的单独文件。第一个文件的头是这样的:

美洲椴树:

ID  Wie Rei Wee
1   2   4   3
2   4   3   4
3   3   2   5
4   5   5   2
5   6   3   4
6   7   4   3

从 DF 中提取 Tilia_american 列并将列名更改为“Common”并将其与 Tilia_american 文件结合后,输出应如下所示:

ID  Wie Rei Wee Common
1   2   4   3   23
2   4   3   4   21
3   3   2   5   20
4   5   5   2   19
5   6   3   4   23
6   7   4   3   22

最后想单独保存每个文件...谢谢

4

2 回答 2

4

在不知道细节的情况下(比如 data.frame 中的文件名和列名是否完全匹配),很难给你具体的建议,但可能是类似的东西。

importMyData <- function(x, my.df) {
    data.from.file <- read.table(x, header = TRUE) # set your import function and its params
    sp.name <- unlist(strsplit(x, ".txt"))
    out <- cbind(data.from.file, my.df[, sp.name])
    out
}

你可以在里面使用这个功能sapply

my.file <- list.files(pattern = ".txt")
sapply(my.file, FUN = importMyData, my.df = my.df)
于 2012-12-19T11:42:29.490 回答
1

您可以使用类似的内容获取物种文件列表

files <- list.files( pattern = ".txt" )

假设这些文本文件具有扩展名.txt并且该文件夹中没有其他文本文件。

species <- gsub( ".txt", "", files )

您可以删除扩展名,然后在Commondata.frame 中有列名。

您现在可以构建一个循环(可能有更好的方法,例如 lapply...):

for( i in 1:length( files ) )
{
    x <- read.table( files[i], header = TRUE )
    x <- cbind( x, Common[ colnames( Common ) == species[i] ] )
    write.table( x, files[i], row.names = FALSE )
}

希望这能让你开始!

于 2012-12-19T11:36:49.550 回答