是否有一个辅助函数可以使代码更清晰?

kor*_*oll 0 r plyr dplyr tibble

我需要对列之一生成的序列求和.我这样做了:

test <- tibble::tibble(
  x = c(1,2,3)
)
test %>% dplyr::mutate(., s = plyr::aaply(x, .margins = 1, .fun = function(x_i){sum(seq(x_i))}))
Run Code Online (Sandbox Code Playgroud)

有更清洁的方法吗?是否有一些帮助函数,构造允许我减少这个:

plyr::aaply(x, .margins = 1, .fun = function(x_i){sum(seq(x_i))})
Run Code Online (Sandbox Code Playgroud)

我正在寻找一个通用的解决方案,这里sum和seq只是一个例子.也许真正的问题是我确实想要在元素上执行函数而不是所有向量.

这是我的真实案例:

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
})
Run Code Online (Sandbox Code Playgroud)

我想通过mutate函数以行方式而不是矢量化的方式来做到这一点.

akr*_*run 5

对于具体的例子,它是直接应用的 cumsum

test %>% 
   mutate(s = cumsum(x))
Run Code Online (Sandbox Code Playgroud)

对于循环遍历行序列的一般情况,我们可以使用 map

test %>% 
     mutate(s = map_dbl(row_number(), ~ sum(seq(.x))))
# A tibble: 3 x 2
#      x     s
#  <dbl> <dbl>
#1     1     1
#2     2     3
#3     3     6
Run Code Online (Sandbox Code Playgroud)

更新

对于更新的数据集,请使用map2,因为我们在数据集dnorm的"x"和"y"列中使用相应的参数

test %>%     
    mutate(V1 = map2_dbl(x, y, ~ dnorm(d, mean = .x, sd = .y) %>% 
                     sum))
# A tibble: 3 x 3
#     x     y    V1
#  <dbl> <dbl> <dbl>
#1     1   0.5 1.56 
#2     2   1   0.929
#3     3   1.5 0.470
Run Code Online (Sandbox Code Playgroud)