【发布时间】: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”的值提取为向量或列表或其他任何内容,然后将它们全部组合到一个数据表中。我觉得有一种快速简便的方法可以做到这一点,但我还没有找到任何东西。我看过here 和here 和here。
一种可能性是获取第二行(我想要的),并将其转换为矩阵(然后将其转置以使其成为行而不是列!?)和 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参数来跳过其中两个文件的行,并且只获取第一个文件的标题。 -
您可以直接读入列表,然后利用列表中的功能,例如
lapply、sapply... -
在
read.delim中设置 header = TRUE 怎么样?我试图用内置的空气质量数据重现你的问题,但没有发生这样的问题。从理论上讲,rbind不会复制相同的列名,除非 R 将它们视为数据的一部分而不是名称。 -
大家好,感谢 cmets。 @SocialFunction:不幸的是,数据文件的方向是我必须按原样导入它,然后删除大部分列(大约有 22 个不需要的列),然后将其转换(列到行,反之亦然)。所以跳过数据文件的 x 行会删除一些我需要的数据。
-
@RomanLuštrik:同样的问题,对不起,我在帖子中不清楚 - 导入后我必须删除很多数据,所以我不认为将其作为list 会起作用,虽然我是 R 新手,所以可能有办法。我可以将处理后的数据帧转换为列表:
listdata001 <- split(data001.txt, seq_len(nrow(data001.txt)))但是如果我尝试将例如该列表的第二行 rbind 到不同的列表,例如combinedlist <- rbind(data002.txt, listdata001[2])那么它也不起作用。我认为问题在于列表值是字符