【问题标题】:Extracting one row from multiple data tables and combining into a new data table while keeping column names从多个数据表中提取一行并组合成一个新的数据表,同时保留列名
【发布时间】:2017-05-17 02:58:13
【问题描述】:

三个文本文件位于同一目录中(“data001.txt”、“data002.txt”、“data003.txt”)。我写了一个循环来读取每个数据文件并生成三个数据表;

for(i in files) {
x <- read.delim(i, header = F, sep = "\t", na = "*")
setnames(x, 2, i)
assign(i,x)
}

假设每个单独的表看起来像这样:

       var1    var2    var3
row1   2       1       3

我使用rbind 来合并所有表格...

combined <- do.call(rbind, mget(ls(pattern="^data")))

得到这样的东西:

       var1    var2    var3
row1   2       1       3
        var1    var2    var3
row1   3       2       4   
       var1    var2    var3
row1   1       3       5

给我留下了多余的列名。目前我可以通过删除包含列名的特定行来解决这个问题,但这有点笨拙。

colnames(combined) = combined[1, ]      # make the first row the column names
combined <- combined[-1, ]              # delete the now-unnecessary first row
toDelete <- seq(1, nrow(combined), 2)   # define which rows to be deleted i.e. every second odd row
combined <- combined[ toDelete ,]       # delete them suckaz

这确实给了我想要的……

       var1    var2    var3
row1   2       1       3
row1   3       2       4   
row1   1       3       5

但我觉得更好的方法是将“row1”的值提取为向量或列表或其他任何内容,然后将它们全部组合到一个数据表中。我觉得有一种快速简便的方法可以做到这一点,但我还没有找到任何东西。我看过hereherehere

一种可能性是获取第二行(我想要的),并将其转换为矩阵(然后将其转置以使其成为行而不是列!?)和 rbind:

data001.txt <- as.matrix(data001.txt[2,])
data001.txt <- t(data001.txt)
combined <- rbind(data001.txt, data002.txt)

这或多或少给了我想要的东西,除了没有列名标题(例如 va1、var2、var3)。

   v1      v2      v3
   2       1       3
   3       2       4

有什么想法吗?如果有某种方法可以添加列名,这第二种方法会很好吗?我觉得它不像第一种方法那么笨重。感谢您的任何意见:)

编辑 - 在下面的答案中解决。

【问题讨论】:

  • 您可以使用read.delim 中的skip 参数来跳过其中两个文件的行,并且只获取第一个文件的标题。
  • 您可以直接读入列表,然后利用列表中的功能,例如lapplysapply...
  • read.delim 中设置 header = TRUE 怎么样?我试图用内置的空气质量数据重现你的问题,但没有发生这样的问题。从理论上讲,rbind 不会复制相同的列名,除非 R 将它们视为数据的一部分而不是名称。
  • 大家好,感谢 cmets。 @SocialFunction:不幸的是,数据文件的方向是我必须按原样导入它,然后删除大部分列(大约有 22 个不需要的列),然后将其转换(列到行,反之亦然)。所以跳过数据文件的 x 行会删除一些我需要的数据。
  • @RomanLuštrik:同样的问题,对不起,我在帖子中不清楚 - 导入后我必须删除很多数据,所以我不认为将其作为list 会起作用,虽然我是 R 新手,所以可能有办法。我可以将处理后的数据帧转换为列表:listdata001 &lt;- split(data001.txt, seq_len(nrow(data001.txt))) 但是如果我尝试将例如该列表的第二行 rbind 到不同的列表,例如combinedlist &lt;- rbind(data002.txt, listdata001[2]) 那么它也不起作用。我认为问题在于列表值是字符

标签: r dataframe


【解决方案1】:

想通了。需要转换为数据矩阵并使用 data.table 包中的set.names。假设您有一系列文本数据文件,如下面的,并且您只想提取第七列(带有数字而不是字母的列),并将它们组合到自己的数据表中,包括行名:

chemical1 a b c d e 1 g h i j k l m 
chemical2 a b c d e 2 g h i j k l m 
chemical3 a b c d e 3 g h i j k l m 
chemical4 a b c d e 4 g h i j k l m 
chemical5 a b c d e 5 g h i j k l m 

设置row.names = 1header = F

setwd("directory") 
files <- list.files(pattern = "data")  # take all files with 'data' in their name
for(i in files) {
    x <- read.delim(i, row.names = 1, header = F, sep = "\t", na = "*")
    setnames(x, 6, i)    # if the data you want is in column six. Sets data file name as the column name.
    x <- as.matrix(x[6]) # just take the sixth column with the numeric data (delete everything else)
    x <- t(x)            # transform (if you want..)
    assign(i,x)
    }

combined <- do.call(rbind, mget(ls(pattern="^data")))    # combine the data matrices into one table
write.table(combined, file="filename.csv", sep=",", row.names=T, col.names = NA)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    • 2021-02-27
    • 2019-02-01
    • 2020-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多