【问题标题】:Return multiple values from a function by column and group in R在R中按列和分组从函数返回多个值
【发布时间】:2014-02-12 12:46:32
【问题描述】:

我正在尝试为数据框中的每个因素找到大于 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"))

我想为每个列 num1、num2 和 num3 以及每个组计算 3 个值(来自函数),如下所示:

res = data.frame(cbind(col=c(rep("num1",3), rep("num2",3), rep("num3",3)), group=rep(c("First group", "Second group","Third group"),3) , p= c(0.3333333, 0.3333333, 1.0000000,1.0000000, 0.3333333,1.0000000,0.0000000,0.3333333,1.0000000), s1= c(-0.1250000, -0.1250000, -0.2500000,-0.2500000,-0.1250000,-0.2500000,0.0000000,-0.1250000,-0.2500000), s2= c(0.1000000, 0.1000000, 0.5000000,0.5000000, 0.1000000, 0.5000000, 0.0000000,0.1000000,0.5000000)))

我可以像这样返回每一列的数据:

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))

但是我不明白如何将它们绑定到数据框并应用于每一列。我尝试了不同的方法(例如this,但它对我不起作用,因为我只得到一列。我试图这样做,然后使用 ggplot2 按组绘制这些值。 你能帮我么?

【问题讨论】:

    标签: r function ggplot2


    【解决方案1】:
    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
    

    【讨论】:

    • Aaaa 是的,更改为长格式!非常感谢!
    【解决方案2】:

    没有额外软件包的解决方案是:

    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)
    

    【讨论】:

    • 非常感谢两位,答案正是我想要的!只是检查我得到的第一个答案,但这也很完美。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 2017-03-26
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多