4

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

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 填充?我的预期输出必须是这样的:

用于 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 和类似的功能,但我无法获得这种特定的输出格式。有人可以帮忙吗?

提前致谢

4

4 回答 4

3

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

  1. 您建议的确切输出。

  2. 每个类别的手段(您提供的输出只是到达那里的一种方法)

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

1.你建议的输出

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

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
于 2013-01-13T05:55:38.153 回答
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 
于 2013-01-13T05:28:17.000 回答
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
于 2013-01-14T08:51:13.713 回答
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
> 
于 2013-01-17T19:27:22.257 回答