将带有两个标头的csv读入data.frame

时间:2012-08-16 12:26:45

标签: r dataframe spreadsheet

对看似简单的问题道歉,但我似乎无法找到解决以下重新安排问题的方法。

我习惯使用read.csv来读取带有标题行的文件,但我有一个带有两个“标题”行的Excel电子表格 - 单元格标识符(a,b,c ... g)和每个细胞的三组测量值(x,y和z;每个1000s):

a           b       
x    y  z   x   y   z
10   1  5   22  1   6
12   2  6   21  3   5
12   2  7   11  3   7
13   1  4   33  2   8
12   2  5   44  1   9

下面的csv文件:

a,,,b,,
x,y,z,x,y,z
10,1,5,22,1,6
12,2,6,21,3,5
12,2,7,11,3,7
13,1,4,33,2,8
12,2,5,44,1,9

如何访问R中的data.frame,如下所示?

cell x  y   z
a    10 1   5
a    12 2   6
a    12 2   7
a    13 1   4
a    12 2   5
b    22 1   6
b    21 3   5
b    11 3   7
b    33 2   8
b    44 1   9

1 个答案:

答案 0 :(得分:6)

使用基础R reshape()

temp = read.delim(text="a,,,b,,
x,y,z,x,y,z
10,1,5,22,1,6
12,2,6,21,3,5
12,2,7,11,3,7
13,1,4,33,2,8
12,2,5,44,1,9", header=TRUE, skip=1, sep=",")
names(temp)[1:3] = paste0(names(temp[1:3]), ".0")
OUT = reshape(temp, direction="long", ids=rownames(temp), varying=1:ncol(temp))
OUT
#     time  x y z id
# 1.0    0 10 1 5  1
# 2.0    0 12 2 6  2
# 3.0    0 12 2 7  3
# 4.0    0 13 1 4  4
# 5.0    0 12 2 5  5
# 1.1    1 22 1 6  1
# 2.1    1 21 3 5  2
# 3.1    1 11 3 7  3
# 4.1    1 33 2 8  4
# 5.1    1 44 1 9  5

基本上,你应该跳过第一行,每三行都有字母a-g。由于子列名称都相同,因此R将自动在第三列之后的所有列之后附加分组编号;所以我们需要在前三列中添加一个分组编号。

您可以创建一个“id”变量,或者,就像我在这里所做的那样,只需使用ID的行名称。

您可以将“time”变量更改为“cell”变量,如下所示:

# Change the following to the number of levels you actually have
OUT$cell = factor(OUT$time, labels=letters[1:2])

然后,删除“时间”栏:

OUT$time = NULL

更新

要回答下面评论中的问题,如果第一个标签不是字母,那么这仍然没有问题。我将采取的顺序如下:

temp = read.csv("path/to/file.csv", skip=1, stringsAsFactors = FALSE)
GROUPS = read.csv("path/to/file.csv", header=FALSE, 
                  nrows=1, stringsAsFactors = FALSE)
GROUPS = GROUPS[!is.na(GROUPS)]
names(temp)[1:3] = paste0(names(temp[1:3]), ".0")
OUT = reshape(temp, direction="long", ids=rownames(temp), varying=1:ncol(temp))
OUT$cell = factor(temp$time, labels=GROUPS)
OUT$time = NULL