【问题标题】:summaryBy and lots of variablessummaryBy 和很多变量
【发布时间】:2019-09-06 15:21:34
【问题描述】:

我想使用 summaryBy 并使用三个分组变量(我的公式右侧),但要汇总 170 个左右的变量(在我的情况下计算中位数)。如何在同一个公式中指定它们?

而不是打字

var1+var2+var3...

等等。我想我可以做一个这样的字符串。这本身就是一个完整的项目,但至少我现在存储了一个字符串,它是所有变量之间的加号。我称之为z1

现在,在我的 summaryBy 脚本中简单地询问 z1 甚至 paste(z1) 不起作用:

d <- summaryBy(paste(z1) ~ year + month + ID,
                data=.., 
                FUN=c(median,sum), 
                na.rm=TRUE)

给出错误:

tapply 中的错误(currVAR, rh.string.factor, function(x) { :
参数必须具有相同的长度

我想这与我在 summaryBy 中指定我的数据这一事实有关。但我是 R 新手,因此无法理解除此之外的问题。

我也按照建议尝试了另一种方法:

d<-summaryBy(paste(z1,"~year+month+ID"),
                data=..,
                FUN=c(median,sum),
                na.rm=TRUE)

这反而给出了错误

.get_variables(formula, data, id, debug.info) 中的错误:'formula' 必须是公式或列表

所以不知道如何去那里。

来自帮助文档:

使用 cbind( ) 对多个变量进行计算 summaryBy(cbind(重量,饲料)~Evit + Cu,数据=子集(dietox,时间> 1), 有趣=有趣)

并对此进行测试,这次 z2 是一个由逗号分隔的所有变量的字符串。

d<-summaryBy(cbind(z2)~year+month+ID,
                data=..,
                FUN=c(median,sum),
                na.rm=TRUE)

或变体

d<-summaryBy(cbind(paste(z2))~year+month+ID,
                data=..,
                FUN=c(median,sum),
                na.rm=TRUE)

两者都给出了我上面最初尝试的参数长度错误。

另一个建议(感谢@akrun):

d<-summaryBy(as.formula(paste(z1,"~year+month+ID")),
                data=..,
                FUN=c(median,sum),
                na.rm=TRUE)'

提醒:z1 是中间加号的变量。

在这种情况下,R 没有给出错误。似乎它正在加载或等待其他命令。控制台如下所示: Screenshot of console 底部没有&gt;.. 这是什么意思?

最终编辑和解决方案:

as.formula 方法奏效了!非常感谢!我现在明白了,如果控制台底部没有箭头,就像我上面的截图一样,这意味着 R 正在计算哈哈。

【问题讨论】:

    标签: r


    【解决方案1】:

    问题在于paste 只是围绕着感兴趣的变量。可以

    library(doBy)
    summaryBy(as.formula(paste(z1, "~ year + month + ID")),
                data=.., 
                FUN=c(median,sum), 
                na.rm=TRUE)
    

    在哪里

    z1 <- paste0('var', 1:3, collapse=" + ")
    

    使用来自?summaryBy 的可重现示例

    data(dietox)
    dietox12    <- subset(dietox,Time==12)
    fun <- function(x){
       c(m=mean(x), v=var(x), n=length(x))
     }
    
    out1 <-  summaryBy(cbind(Weight, Feed) ~ Evit + Cu, data=dietox12,
           FUN=fun)
    
    out2 <-  summaryBy(Weight +  Feed ~ Evit + Cu, data=dietox12,
                          FUN=fun)
    
    z2 <- paste(c("Weight", "Feed"), collapse=" + ")
    out3 <- summaryBy(as.formula(paste(z2,  "~ Evit + Cu")), data=dietox12,
           FUN=fun)
    identical(out1, out2)
    #[1] TRUE
    identical(out1, out3)
    #[1] TRUE
    

    【讨论】:

      【解决方案2】:

      所以,感谢@akrun,下面的代码现在可以工作了:

      d<-summaryBy(as.formula(paste(z1,"~year+month+ID")),
                    data=..,
                    FUN=c(median,sum),
                    na.rm=TRUE)
      

      一开始我认为它没有的原因是因为计算时间太长了!毕竟这是一个庞大的数据集。编辑了我的原始帖子,但把我所有的尝试都留在了那里,包括关于“丢失的箭头”的问题,我现在明白这意味着 R 正在工作。难的。谢谢!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-11
        • 1970-01-01
        • 1970-01-01
        • 2015-11-16
        • 2011-02-17
        相关资源
        最近更新 更多