我有以下数据结构(实际上是通过使用ddply计算“结果”的出现次数来创建的):
Experiment Result Count
A 1 123
A 2 30
A 3 5
B 1 120
B 2 20
B 3 5
B 4 1
B 5 1
C 1 130
C 2 21
...
我想创建一个类似的数据框,对所有大于2的结果进行分组(计算总和)。
预期结果:
Experiment Result Count
A 1 123
A 2 30
A >2 5
B 1 120
B 2 20
B >2 7
C 1 130
C 2 21
...
可能plyr可以做到这一点,但我是R的新手并且不知道如何使用自定义条件(即结果1,2,> 2)而不仅仅是列的不同值。
注意:我不介意新bin的名称(即可能是!='< 2')。
答案 0 :(得分:2)
data <- data.frame(Experiment = c("a","a","a","b","b","b"),
Result = c(1,2,3,1,4,5), Count = c(1,4,6,5,3,6))
part1 <- subset(data, Result<=2)
part2 <- cbind(ddply(data, .(Experiment), summarise,
Count = sum(Count[Result>2])), Result = ">2")
final <- rbind(part1,part2)
final[with(final, order(Experiment, rev(Result))),]
Experiment Result Count
1 a 1 1
2 a 2 4
41 a >2 6
4 b 1 5
5 b >2 9
data
Experiment Result Count
1 a 1 1
2 a 2 4
3 a 3 6
4 b 1 5
5 b 4 3
6 b 5 6
答案 1 :(得分:1)
这是基础:
#Read in your data:
dat <- read.table(text="Experiment Result Count
A 1 123
A 2 30
A 3 5
B 1 120
B 2 20
B 3 5
B 4 1
B 5 1
C 1 130
C 2 21", header=T)
#The code:
dat$bp <- factor(cut(dat$Result, c(0,2, Inf)),
labels=c(NA, "> 2")) #bin dat > 2
LS1 <- split(dat, dat$bp) #split by bins
LS2 <- aggregate(Count~Experiment, LS1[[2]], sum) #sum by experiment
LS2$Result <- LS2$bp <- unique(LS1[[2]]$bp) #get columns ready for bind
LS2 <- LS2[, names(LS1[[1]])]
DF <- do.call(rbind, list(LS1[[1]], LS2))[, -4] #bind it together & drop bp
DF$Result <- factor(DF$Result,
levels = unique(DF$Result)) #reorder factor
DF[order(DF$Experiment, DF$Result), ] #order dataframe
哪个收益率
Experiment Result Count
1 A 1 123
2 A 2 30
7 A > 2 5
4 B 1 120
5 B 2 20
8 B > 2 7
9 C 1 130
10 C 2 21
答案 2 :(得分:1)
感谢您的回答。与此同时,我提出了这个解决方案:
data2 <- ddply(data[data$Result>2,],c('Experiment'), function(x) c(Result='>2', Count=sum(x$sum)))
data3 <-rbind(data[data$Result<=2,], data2)
(结果仍然需要重新排序。)