对看似简单的问题道歉,但我似乎无法找到解决以下重新安排问题的方法。
我习惯使用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
答案 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