【问题标题】:Automatically rowwise a function for dataframe usage自动逐行使用数据框的函数
【发布时间】:2017-06-02 15:16:30
【问题描述】:

我有一个函数**:

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))?

** 实际功能要复杂得多

【问题讨论】:

    标签: r dplyr tidyverse


    【解决方案1】:

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

    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
    

    【讨论】:

    • 我的实际功能比runif复杂很多:(
    • @emehex 抱歉,这是对其进行矢量化的一种方法。如果您的功能不灵活,那么更改原始选项没有意义
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    • 2012-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多