我有一个像这样的数据集:
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函数,但我无法获得这种特殊的输出格式。有人可以帮忙吗?
提前致谢
答案 0 :(得分:3)
你想要的答案可能是两件事之一。
您建议的确切输出。
每个类别的平均值(您提供的输出只是一种到达目的地的方法)
我将使用plyr和reshape2,但毫无疑问@mnel将很快提供data.table解决方案。
这里的问题是您有多个具有多个元素的组。首先,我们需要对元素进行分组(使用@ 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",]
这更简单:
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
>