我有一个功能**:
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)
)?
** 实际功能要复杂得多
答案 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