【问题标题】:trouble with a user-defined function in aggregate汇总用户定义函数的问题
【发布时间】:2015-03-03 22:10:52
【问题描述】:

我正在尝试通过编写一个插入聚合的函数来从 for 循环中毕业。进展不顺利。

样本数据为:

group <- c(1, 1, 1, 2, 2, 2, 2, 2, 3, 1, 1, 1, 2, 2)
gdp <- c(3.5, 4.2, 5, 4, 4.2, 5, 5.5, 6, 3.5, 3.4, 4.0, 4.1, 4.3, 4.7)
df <- data.frame(group, gdp)

函数的目标,它不能正常工作,是对于一个组内的每个 x (gdp) 值,找到 x 与 x 的最小值之间的绝对差,以及 x 与 x 的最大值之间的差x,并返回较小的差值。如果组中只有 1 个值,或者该值是组中的第一项或最后一项,则差值为 0,在这种情况下返回 0。

顺序很重要,因为我不希望它整理所有第 1 组的;我希望将函数应用于组中的每个 gdp 值,然后继续到下一个组。

函数是:

get_dist <- function(x){  
    a <- abs(x - min(x)) 
    b <- abs(x -max(x))   
    c <-  ifelse(a < b, a, ifelse(a = 0), 0, b) 
    return(c)
}

然后是最后一步,使用聚合:

edge_dist <- with(df, aggregate(group, list(gdp), get_dist))

对我哪里出错有什么建议吗?它没有返回我所希望的。

【问题讨论】:

  • c的定义中,第一个右括号应该在b之后而不是a = 0之后。
  • 你还需要a==0而不是a=0
  • 伟大的收获,亚历克斯。我仍然得到无意义的输出。
  • 谢谢@eipi10。又一个愚蠢的错误。但我仍然得到不正确的输出(只是不同的输出不正确)。
  • 你的预期输出是什么

标签: r aggregate


【解决方案1】:

使用 data.table 代替聚合:

library(data.table)

# step 1: assign unique groups
u_grps <- rle(df$group)$lengths
df$id <- rep(1:length(u_grps), u_grps)

# step 2: calculate your row-level stuff using data.table
data.table(df)[, min_abs_diff:=pmin(abs(gdp-max(gdp)), abs(gdp-min(gdp))), 
               by=id][]

# result:
#     group gdp id  min_abs_diff
#  1:     1 3.5  1           0.0
#  2:     1 4.2  1           0.7
#  3:     1 5.0  1           0.0
#  4:     2 4.0  2           0.0
#  5:     2 4.2  2           0.2
#  6:     2 5.0  2           1.0
#  7:     2 5.5  2           0.5
#  8:     2 6.0  2           0.0
#  9:     3 3.5  3           0.0
# 10:     1 3.4  4           0.0
# 11:     1 4.0  4           0.1
# 12:     1 4.1  4           0.0
# 13:     2 4.3  5           0.0
# 14:     2 4.7  5           0.0

注意:这个例子只是打印输出。如果要存储在对象中,请使用类似

df2 <- 
  data.table(df)[, min_abs_diff:=pmin(abs(gdp-max(gdp)), abs(gdp-min(gdp))), 
                 by=id]

【讨论】:

  • 在阅读 cmets 中对问题的说明时,我认为这比我的答案要好得多。
  • @arvi 1000 金币,宝贝。丹克肖恩
  • data.table 适当地具有rleid 功能。可以生成组idby=rleid(group)
  • 我认为这只是在 1.9.5 开发版本中?我的 1.9.4 版本(CRAN 上的最新版本)没有rleid()。很好的提示!
猜你喜欢
  • 2016-11-30
  • 2020-11-04
  • 1970-01-01
  • 2020-12-27
  • 2021-05-07
  • 1970-01-01
  • 2020-09-20
  • 2011-02-17
  • 1970-01-01
相关资源
最近更新 更多