从多个数据表中提取一行并合并到一个新的数据表中,同时保留列名

时间:2017-05-17 02:58:13

标签: r dataframe

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

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

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

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

这确实给了我想要的东西......

   v1      v2      v3
   2       1       3
   3       2       4

但我觉得更好的方法就是提取&#34; row1&#34;作为向量或列表或其他什么,并将它们组合在一起成为一个数据表。我觉得有一个快速简便的方法可以做到这一点,但我还没有找到任何东西。我看了herehere以及here

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

{{1}}

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

{{1}}

有什么想法吗?如果有某种方法添加列名,第二种方法是否可以正常工作?我觉得它比第一种方法更不笨重。感谢您的任何意见:)

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

1 个答案:

答案 0 :(得分:0)

想出来。转换为数据矩阵并使用所需的data.table包中的set.names。假设您有一系列文本数据文件,如下所示,并且您只想提取第七列(带有数字而不是字母的那一列),并将它们组合在一起,放在他们自己的数据表中,包括行名称: / p>

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)
相关问题