【问题标题】:I would like to use dplyr::mutate than plyr::ddply function in pipeline processing我想在管道处理中使用 dplyr::mutate 而不是 plyr::ddply 函数
【发布时间】:2019-01-09 18:23:46
【问题描述】:

我想通过 mutate 函数而不是 ddplyr one 来做我在这里所做的事情。是否有可能在这里以某种方式执行非矢量化操作?

test <- tibble::tibble(
  x = c(1,2,3),
  y = c(0.5,1,1.5)
)
d <- c(1.23, 0.99, 2.18)

test %>% mutate(., s = (function(x, y) {
  dn <- dnorm(x = d, mean = x, sd = y)
  s <- sum(dn)
  s
})(x,y))

test %>% plyr::ddply(., c("x","y"), .fun = function(row) {
  dn <- dnorm(x = d, mean = row$x, sd = row$y)
  s <- sum(dn)
  s
})

【问题讨论】:

  • test %&gt;% rowwise() %&gt;% mutate(...) 是获得按行分组进行操作的门票

标签: r dplyr plyr tibble


【解决方案1】:

一种流行的方法是使用dplyr 函数:rowwise()

library(tidyverse)

test <- tibble::tibble(
  x = c(1,2,3),
  y = c(0.5,1,1.5)
)
d <- c(1.23, 0.99, 2.18)

test %>% 
  rowwise() %>%                                # prior to mutate specify calculate rowwise
  mutate(., s = (function(x, y) {
    dn <- dnorm(x = d, mean = x, sd = y)
    s <- sum(dn)
    s})(x,y))

这会产生以下结果:

# A tibble: 3 x 3
      x     y     s
  <dbl> <dbl> <dbl>
1     1   0.5 1.56 
2     2   1   0.929
3     3   1.5 0.470

【讨论】:

  • 不幸的是,它给了我错误的答案。 # 一个小标题:3 x 3 x y s * 1 1 0.5 1.19 2 2 1 1.19 3 3 1.5 1.19 应该是:x y V1 1 1 0.5 1.5647681 2 2 1.0 0.9286773 3 3 1.5 0.4699 >
  • 数字相同,只是四舍五入到两位小数。
  • 如果您使用 ddply 运行代码,结果是 1.5647681、0.9286773、1.5 0.4699930。这是我对代码的期望。它甚至可以是圆形的。 :) 解决方案可能是 map() 函数。
  • 运行我上面的代码会产生你想要的四舍五入的结果。你没有得到同样的结果吗?我不明白如何提供帮助。
  • 控制台打印输出中显示的小数位数取决于您可能设置的全局选项,以及调用print 的对象类型。如果打印的位置数量存在差异,请检查存储的实际值,而不仅仅是打印出来的值
猜你喜欢
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-02
  • 2014-11-03
  • 1970-01-01
  • 2023-03-07
  • 2019-02-09
相关资源
最近更新 更多