1

考虑这个简单的例子

library(dplyr)
library(purrr)

mydata <- dplyr::data_frame('value' = c(1,2,3))
> mydata
# A tibble: 3 x 1
  value
  <dbl>
1    1.
2    2.
3    3.

我有一个以dataframeand anumber作为参数的函数,我想在每次迭代时修改数据框。

我写了以下内容,但它没有更新数据框:

  myfunc <- function(df, numba){
  name_var <- paste('year_', quo_name(numba), sep ='')
  df <- df %>% mutate(!!name_var := 1)
  return(df)
}

seq(2006, 2007, by = 1) %>% 
    purrr::walk(function(x) {mydata <- myfunc(mydata, x)})

不幸mydata的是没有正确修改:

seq(2006, 2007, by = 1) %>% 
    map(function(x) {mydata <- myfunc(mydata, x)})

给出:

[[1]]
# A tibble: 3 x 2
  value year_2006
  <dbl>     <dbl>
1    1.        1.
2    2.        1.
3    3.        1.

[[2]]
# A tibble: 3 x 2
  value year_2007
  <dbl>     <dbl>
1    1.        1.
2    2.        1.
3    3.        1.

而预期的输出应该是

# A tibble: 3 x 3
  value year_2006 year_2007
  <dbl>     <dbl>     <dbl>
1    1.        1.        1.
2    2.        1.        1.
3    3.        1.        1.

我在这里想念什么?谢谢!

4

2 回答 2

1

map以列表形式返回结果。您可以使用map_dfc按列绑定每年的结果,然后删除额外的value

    seq(2006, 2007, by = 1) %>% 
      map_dfc(function(x) {mydata <- myfunc(mydata, x)}) %>% 
      select(value, matches("year_"))

    # or even shorter
    seq(2006, 2007, by = 1) %>% 
      map_dfc(~ myfunc(mydata, .)) %>% 
      select(value, matches("year_"))

    # A tibble: 3 x 3
      value year_2006 year_2007
      <dbl>     <dbl>     <dbl>
    1    1.        1.        1.
    2    2.        1.        1.
    3    3.        1.        1.
于 2018-03-10T22:30:02.170 回答
-3

首先,是应该mydata <- data.frame('value' = c(1,2,3)),不是mydata <- data_frame('value' = c(1,2,3))。现在,要解决您的问题,您应该返回数据框以对其进行修改。像这样:

myfunc <- function(df, numba){
    name_var <- paste('year_', quo_name(numba), sep ='')
    df <- df %>% mutate(name_var = 1)
    return(df)
}

编辑

尝试使用

seq(2006, 2007, by = 1) %>% 
 map(function(x) {mydata <- myfunc(mydata, x)})
于 2018-03-07T15:13:59.070 回答