基于列值的子集数据框

时间:2015-01-19 11:51:37

标签: r dataframe subset

我有一个数据框,包含随时间跟踪的多个细胞的荧光读数,例如:

Number=c(1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4)
Fluorescence=c(9,10,20,30,8,11,21,31,6,12,22,32,7,13,23,33)
df = data.frame(Number, Fluorescence)

获得:

   Number Fluorescence
1       1            9
2       2           10
3       3           20
4       4           30
5       1            8
6       2           11
7       3           21
8       4           31
9       1            6
10      2           12
11      3           22
12      4           32
13      1            7
14      2           13
15      3           23
16      4           33

数字与细胞编号有关。我想要的是根据细胞数量整理荧光读数。这里的data.frame有1-4个,而我真的想要这样的东西:

   Number Fluorescence
1       1            9
2       1            8
3       1            6
4       1            7
5       2           10
6       2           11
7       2           12
8       2           13
9       3           20
10      3           21
11      3           22
12      3           23
13      4           30
14      4           31
15      4           32
16      4           33

或者甚至更理想的是基于数字的列,然后是相应的细胞荧光:

        1    2    3    4
1       9    10   20   30
2       8    11   21   31
3       6    12   22   32
4       7    13   23   33

我已经使用了哪个函数一次提取一个:

Cell1=df[which(df[,1]==1),2]

但这需要我为每个单元格写一行(其中有数百个)。

感谢您对此有任何帮助!抱歉,我仍然是一个R noob。

1 个答案:

答案 0 :(得分:1)

这个怎么样:

library(tidyr);library(data.table)
number <- c(1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4)
fl <- c(9,10,20,30,8,11,21,31,6,12,22,32,7,13,23,33)
df <- data.table(number,fl)
df[, index:=1:.N, keyby=number]
df
    number fl index
 1:      1  9     1
 2:      1  8     2
 3:      1  6     3
 4:      1  7     4
 5:      2 10     1
 6:      2 11     2
 7:      2 12     3
 8:      2 13     4
 9:      3 20     1
10:      3 21     2
11:      3 22     3
12:      3 23     4
13:      4 30     1
14:      4 31     2
15:      4 32     3
16:      4 33     4

spread tidyr函数中的唯一标识符添加索引。查看this帖子了解更多信息。

spread(df,number,fl)
   index 1  2  3  4
1:     1 9 10 20 30
2:     2 8 11 21 31
3:     3 6 12 22 32
4:     4 7 13 23 33