自动按行排列数据框使用的函数

时间:2017-06-02 15:16:31

标签: r dplyr tidyverse

我有一个功能**:

do_thing <- function(x) {
    return(x + runif(1, 0, 100))
}

我想申请我的数据:

df <- tibble(x = 1:10)

最好使用mutate

set.seed(1)
df %>% 
    mutate(y = do_thing(x))

但是,该功能未按预期执行:

#       x y
# 1     1 27.55087
# 2     2 28.55087
# 3     3 29.55087
# 4     4 30.55087
# 5     5 31.55087
# 6     6 32.55087
# 7     7 33.55087
# 8     8 34.55087
# 9     9 35.55087
# 10   10 36.55087

我实际上希望函数以行方式应用:

df %>% 
    rowwise() %>% 
    mutate(y = do_thing(x))

#       x  y
# 1     1  38.21239
# 2     2  59.28534
# 3     3  93.82078
# 4     4  24.16819
# 5     5  94.83897
# 6     6 100.46753
# 7     7  73.07978
# 8     8  70.91140
# 9     9  15.17863
# 10   10  30.59746

有没有一种方法可以重写我的功能,使其灵活,并且在仍然使用单个输入时可以自动默认为行(即。do_thing(100))?

** 实际功能要复杂得多

1 个答案:

答案 0 :(得分:0)

我们可以将runif指定为数据集的行数(n),而不是获取n() 1个观察值

set.seed(24)
df %>%
     mutate(y = x + runif(n(), 0, 100))
# A tibble: 10 x 2
#       x          y
#   <int>      <dbl>
# 1     1  46.952549
# 2     2  61.939816
# 3     3  94.972191
# 4     4 102.282408
# 5     5   8.780258
# 6     6  63.793740
# 7     7  80.331417
# 8     8  32.874240
# 9     9  39.073652
#10    10  83.346670