【问题标题】:Using R dplyr throws error使用 R dplyr 会引发错误
【发布时间】:2015-04-21 07:08:24
【问题描述】:

我正在学习使用 dplyr pkg。

library(dplyr)

一个玩具数据集:

d <- expand.grid("id"=1:3,"x1"=10:12,"x2"=(20:22))

稍后我可能需要遍历列,我的真实数据有 30K 行,70 列

i <- 2

这里我希望使用通用变量名

my.variable <- names(d[i])
my.variable

将每个组标准化为 0-1 范围的函数

norm <- function(x) (x - min(x,na.rm = TRUE))/(max(x,na.rm = TRUE)-min(x,na.rm = TRUE))

df.out <- d %>% group_by(id) %>% mutate(x.norm = norm(get(my.variable, envir = as.environment(d))))

抛出错误:

Error: incompatible size (%d), expecting %d (the group size) or 1

对于错误原因的任何帮助表示赞赏。另外,这是一种可行的方法来完成这个规范化任务吗?

【问题讨论】:

    标签: r statistics package dplyr


    【解决方案1】:

    不知道您是否真的想要@James 回答中的列。据我了解您的问题:

    d %>% group_by(id) %>% mutate_each(funs(norm(.)))
    
    Groups: id
    
       id  x1  x2
    1   1 0.0 0.0
    2   2 0.0 0.0
    3   3 0.0 0.0
    

    ...

    【讨论】:

    • 谢谢迪特!一个极好的和经济的解决方案!我已经对您的解决方案进行了一些 33K 行和 73 列的压力测试:在老化的笔记本电脑上不到 2 秒即可处理。超出了我的所有期望。
    • 赞美哈德利。之前的ddplyr 是一个很棒的概念,但速度很慢。所以dplyr 的重启是值得的。
    【解决方案2】:

    问题来自于使用get,我敢肯定这违反了@hadley 许可协议;)

    要评估字符参数,您可以使用mutate_each_q。但是,当使用单个函数时,它会覆盖变量,因此您必须使用两个函数,然后删除第二个变量:

    d %>% group_by(id) %>% mutate_each_q(funs(x.norm=norm, identity),my.variable) %>%
          select(-identity)
    Source: local data frame [6 x 4]
    Groups: id
    
      id x1 x2 x.norm
    1  1 10 20    0.0
    2  2 10 20    0.0
    3  3 10 20    0.0
    4  1 11 20    0.5
    5  2 11 20    0.5
    6  3 11 20    0.5
    ...
    

    【讨论】:

    • +1 表示 hadley 许可协议。但是,mutate_each_q 已弃用,head 隐含在 tbl_df 中,即来自 dplyr 的结果(略微简化)。
    • 向哈德利·威克姆致敬!詹姆斯,感谢您的意见和一些对我来说很新的想法。
    猜你喜欢
    • 1970-01-01
    • 2017-12-22
    • 2019-11-10
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 2012-08-25
    相关资源
    最近更新 更多