从R中的数据帧中提取复杂子集

时间:2013-01-13 05:15:18

标签: r dataframe

我有一个像这样的数据集:

testdata <- read.table(header=T, text='
patids labels dbins vprobs Response 
16186 SUP0         0.0         100        1 
16186 SUP0         0.2         99        1 
16186 SUP0         0.4         95        1 
16186 SUP0         0.6         99        1 
16186 SUP0         0.8         50        1 
16186 SUP0         1.0         0        1 
18185 SUP0         0.0         100        0 
18185 SUP0         0.2         100        0 
18185 SUP0         0.4         5        0 
18185 SUP0         0.6         2        0 
18185 SUP0         0.8         0        0 
54234 INF0         0.0         100        1 
54234 INF0         0.2         95        1 
54234 INF0         0.4         90        1 
54234 INF0         0.6         30        1 
54234 INF0         0.8         0        1 
18185 INF0         0.0         100        0 
18185 INF0         0.2         20        0 
18185 INF0         0.4         10        0 
18185 INF0         0.6         5        0 
18185 INF0         0.8         3        0 
18185 INF0         1.0         0        0 
16186 INF0         0.0         100        1 
16186 INF0         0.2         100        1 
16186 INF0         0.4         70        1 
16186 INF0         0.6         60        1 
16186 INF0         0.8         50        1 
16186 INF0         1.0         0        1 
54234 SUP1         0.0         100        1 
54234 SUP1         0.2         95        1 
54234 SUP1         0.4         90        1 
54234 SUP1         0.6         30        1 
54234 SUP1         0.8         0        1 
18185 SUP1         0.0         100        0 
18185 SUP1         0.2         50        0 
18185 SUP1         0.4         0        0
16186 SUP1         0.0         100        1 
16186 SUP1         0.2         100        1 
16186 SUP1         0.4         40        1 
16186 SUP1         0.6         10        1 
16186 SUP1         0.8         22        1 
16186 SUP1         1.0         0        1 ')

现在,对于每个“标签”,即SUP0,SUP1等,我想获得变量dbins的平均值(平均值取自所有唯一的“patids”变量。我面临的问题是“dbins”是对于每个“patids”,并不是所有长度都相同。在采取这种方法之前,是否有某种方法可以填充NA或0?我的预期输出必须是这样的:

for SUP0

labels dbins dbins.16186 dbins.18185
SUP0         0.0         0.0 
SUP0         0.2         0.2          
SUP0         0.4         0.4          
SUP0         0.6         0.6          
SUP0         0.8         0.8          
SUP0         1.0         NA 

和INF0

labels      dbins.54234 dbins.18185 dbins.16186
INF0         0.0         0.0        0.0    0.0    
INF0         0.2         0.2        0.0    0.2   
INF0         0.4         0.4        0.0    0.4   
INF0         0.6         0.6        0.0    0.6   
INF0         0.8         0.8        0.8    0.8   
INFO         NA          1.0        1.0    1.0 

...这样我就可以对列进行统治。

我一直在尝试使用ddply和simillar函数,但我无法获得这种特殊的输出格式。有人可以帮忙吗?

提前致谢

4 个答案:

答案 0 :(得分:3)

你想要的答案可能是两件事之一。

  1. 您建议的确切输出。

  2. 每个类别的平均值(您提供的输出只是一种到达目的地的方法)

  3. 我将使用plyr和reshape2,但毫无疑问@mnel将很快提供data.table解决方案。

    1。您建议的输出

    这里的问题是您有多个具有多个元素的组。首先,我们需要对元素进行分组(使用@ Maiasaura的解决方案here)。

    library(plyr)
    testgroups <- ddply(testdata, .(labels, patids), function(x) { x$group <- 1:nrow(x); x })
    

    然后我们可以正确地重塑它们:

    library(reshape2)
    testreshape <- dcast(testgroups[,c("labels", "patids", "dbins", "group")], labels+group~patids, value.var="dbins")
    
       labels group 16186 18185 54234
    1    INF0     1   0.0   0.0   0.0
    2    INF0     2   0.2   0.2   0.2
    3    INF0     3   0.4   0.4   0.4
    4    INF0     4   0.6   0.6   0.6
    5    INF0     5   0.8   0.8   0.8
    6    INF0     6   1.0   1.0    NA
    7    SUP0     1   0.0   0.0    NA
    8    SUP0     2   0.2   0.2    NA
    9    SUP0     3   0.4   0.4    NA
    10   SUP0     4   0.6   0.6    NA
    11   SUP0     5   0.8   0.8    NA
    12   SUP0     6   1.0    NA    NA
    13   SUP1     1   0.0   0.0   0.0
    14   SUP1     2   0.2   0.2   0.2
    15   SUP1     3   0.4   0.4   0.4
    16   SUP1     4   0.6    NA   0.6
    17   SUP1     5   0.8    NA   0.8
    18   SUP1     6   1.0    NA    NA
    

    从这里你可以使用像testreshape[testreshape$labels=="INF0",]

    这样的东西

    2。每个类别的平均值

    这更简单:

    library(plyr)
    testmeans <- ddply(testdata, .(labels, patids), summarise, mean=mean(dbins, na.rm=TRUE))
    
      labels patids mean
    1   INF0  16186  0.5
    2   INF0  18185  0.5
    3   INF0  54234  0.4
    4   SUP0  16186  0.5
    5   SUP0  18185  0.4
    6   SUP1  16186  0.5
    7   SUP1  18185  0.2
    8   SUP1  54234  0.4
    

答案 1 :(得分:2)

只需使用mean直接获取每个类别的tapply,这是为不规则数组制作的:

tapply(testdata$dbins, interaction(testdata$labels, testdata$patid, drop=TRUE), FUN=mean)
## INF0.16186 SUP0.16186 SUP1.16186 INF0.18185 SUP0.18185 SUP1.18185 INF0.54234 SUP1.54234 
##        0.5        0.5        0.5        0.5        0.4        0.2        0.4        0.4 

答案 2 :(得分:1)

  

我想获得变量dbins的平均值(意味着取代所有独特的“patids”变量

使用data.table

R) library(data.table)
R) testdata=as.data.table(testdata)
R) testdata
    patids labels dbins vprobs Response
 1:  16186   SUP0   0.0    100        1
 2:  16186   SUP0   0.2     99        1
 3:  16186   SUP0   0.4     95        1
---
40:  16186   SUP1   0.6     10        1
41:  16186   SUP1   0.8     22        1
42:  16186   SUP1   1.0      0        1
    patids labels dbins vprobs Response

R) testdata[,list(dbins=mean(dbins)),by="patids"]
   patids dbins
1:  16186   0.5
2:  18185   0.4
3:  54234   0.4

答案 3 :(得分:1)

直接表示:

> require(data.table)
> testdata <- as.data.table(testdata)
> testdata[, mean(dbins), by=c("patids","labels")]
   patids labels  V1
1:  16186   SUP0 0.5
2:  18185   SUP0 0.4
3:  54234   INF0 0.4
4:  18185   INF0 0.5
5:  16186   INF0 0.5
6:  54234   SUP1 0.4
7:  18185   SUP1 0.2
8:  16186   SUP1 0.5
>