R语言 tapply算法改进

2wnc66cl  于 2023-06-19  发布在  其他
关注(0)|答案(2)|浏览(127)

The order of the return object from tapply() is ambiguous,所以我开始担心这段代码:

#d <- data.frame(value = c(1,2,3,5), 
#               source = c("a","a","b","b"))
d$value <- unlist(tapply(d$value, d$source, function(v) v-v[1]))

这个想法是将value分成几组,然后移动其元素的每个组,使该组从0开始。
”””什么是一个更好的方式来做这件事?**我有几个想法,但我想不出任何

  • 不使用第三方库
  • 还是一句俏皮话
  • 避免R循环
  • 不涉及对原始 Dataframe 进行排序/合并。
rvpgvaaj

rvpgvaaj1#

base R中一个鲜为人知的技巧是split(x, y) <- lapply(split(x, y), f)范式,所以下面的一行程序满足了您的所有要求:

d <- data.frame(value = c(1,2,3,5), 
                source = c("a","a","b","b"))

split(d$value, d$source) <- lapply(split(d$value, d$source), \(x) x - x[1])

导致:

d
#>   value source
#> 1     0      a
#> 2     1      a
#> 3     0      b
#> 4     2      b

无论source的顺序如何
创建于2023-06-06带有reprex v2.0.2

envsm3lx

envsm3lx2#

希望ave有意义

> transform(d,value = ave(value,source, FUN = \(x) x-x[1]))
  value source
1     0      a
2     1      a
3     0      b
4     2      b

相关问题