按R中的列和组从函数返回多个值

按R中的列和组从函数返回多个值,r,function,ggplot2,R,Function,Ggplot2,我试图找出数据框中每个因子大于20的数据比例,然后使用这些比例计算其他2个值: dat <- data.frame(num1=as.numeric(c(10,30,4,60,20,1,34,87,66)), num2=as.numeric(c(23,36,42,18,3,44,32,65,78)), num3=as.numeric(c(0,0,0,20,80,10,50,43,70)), group=c("First group", "First group","First group",

我试图找出数据框中每个因子大于20的数据比例,然后使用这些比例计算其他2个值:

dat <- data.frame(num1=as.numeric(c(10,30,4,60,20,1,34,87,66)), num2=as.numeric(c(23,36,42,18,3,44,32,65,78)), num3=as.numeric(c(0,0,0,20,80,10,50,43,70)), group=c("First group", "First group","First group", "Second group","Second group","Second group", "Third group","Third group","Third group"))
我可以返回每列的数据,如下所示:

prop <- function(s) {
 n= length(s)
 x=length(s[s>20])
 p=x/n
 s1=(p/2-p)/(p+1)
 s2=(p/2-p)/(p-2)
 return(c(p,s1,s2))
 }

ddply(dat, .(group), summarise, prop(num1))
prop 20])
p=x/n
s1=(p/2-p)/(p+1)
s2=(p/2-p)/(p-2)
返回(c(p,s1,s2))
}
ddply(数据,组,总结,项目(num1))
但是,我不明白如何将它们绑定到一个数据框架中并应用到每一列。我尝试了不同的方法(例如,但它不适合我,因为我一直只得到一列。我尝试通过使用ggplot2按组绘制这些值的方式来实现这一点。 你能帮帮我吗?

prop20])
prop <- function(s) {
  n= length(s)
  x=length(s[s>20])
  p=x/n
  s1=(p/2-p)/(p+1)
  s2=(p/2-p)/(p-2)
  data.frame(p,s1,s2)
}

library(reshape2)
dat <- melt(dat, id="group")
library(plyr)
ddply(dat, .(variable, group), function(df) prop(df$value))

#  variable        group         p     s1  s2
#1     num1  First group 0.3333333 -0.125 0.1
#2     num1 Second group 0.3333333 -0.125 0.1
#3     num1  Third group 1.0000000 -0.250 0.5
#4     num2  First group 1.0000000 -0.250 0.5
#5     num2 Second group 0.3333333 -0.125 0.1
#6     num2  Third group 1.0000000 -0.250 0.5
#7     num3  First group 0.0000000  0.000 0.0
#8     num3 Second group 0.3333333 -0.125 0.1
#9     num3  Third group 1.0000000 -0.250 0.5
p=x/n s1=(p/2-p)/(p+1) s2=(p/2-p)/(p-2) 数据帧(p,s1,s2) } 图书馆(E2)
dat无附加包装的解决方案为:

s1<-function(p){(p/2-p)/(p+1)}
s2<-function(p){(p/2-p)/(p-2)}

dat.split <- split(dat,dat$group)
L<-lapply(dat.split,function(data){
  group<-data[,1:3]
  p1<-sum(group$num1>20)/nrow(group)
  p2<-sum(group$num2>20)/nrow(group)
  p3<-sum(group$num2>20)/nrow(group)
  tmp<-c(p1,p2,p3)
  return(data.frame(name=c("num1","num2","num3"),
                    group=data[,4],
                    prob=tmp,
                    stat1=sapply(tmp,s1),
                    stat2=sapply(tmp,s2)))
})

do.call("rbind", L)

s1非常感谢两位,答案都正是我想要的!只是检查我得到的第一个答案,但这也是完美的。Aaaa是的,更改为长格式!非常感谢你!
s1<-function(p){(p/2-p)/(p+1)}
s2<-function(p){(p/2-p)/(p-2)}

dat.split <- split(dat,dat$group)
L<-lapply(dat.split,function(data){
  group<-data[,1:3]
  p1<-sum(group$num1>20)/nrow(group)
  p2<-sum(group$num2>20)/nrow(group)
  p3<-sum(group$num2>20)/nrow(group)
  tmp<-c(p1,p2,p3)
  return(data.frame(name=c("num1","num2","num3"),
                    group=data[,4],
                    prob=tmp,
                    stat1=sapply(tmp,s1),
                    stat2=sapply(tmp,s2)))
})

do.call("rbind", L)