簡體   English   中英

在每個字符向量上應用purrr :: map

[英]Applying purrr::map over each of a vector of characters

我正在努力嘗試更好地理解purrr :: map函數。 假設我有一個簡單的字符向量,我想運行一些函數,使用每個字符作為輸入輸出數據幀。

這是一個玩具的例子

animals <- c('sheep', 'cow', 'horse')

make_df <- function(x){
    data.frame(r1 = rnorm(1:5), r2 = rnorm(1:5), an = x)
}

這是make_df

> make_df('sheep')
r1          r2           an
-0.18069698 -0.4767575  sheep
0.09580225  0.2785548   sheep
-0.74701529 0.2673391   sheep
-1.62795239 1.0026010   sheep
0.36573951  -0.2323944  sheep

現在,我想為每只動物運行此函數並將每個數據幀保存到列表中,並將該列表放在一個新數據框中,其中一列是動物,一列是數據框列表(我將使用它其他整擺功能)。

我認為這樣做的方法就像data.frame(animals = animals) %>% mutate(ldf = map(animals, make_df(.)))

 data.frame(animals = animals) %>% mutate(ldf = map(animals, make_df(.)))

但這給了我一個錯誤

 Error in mutate_impl(.data, dots): Evaluation error: arguments imply differing number of rows: 5, 3. Traceback: 1. data.frame(animals = animals) %>% mutate(ldf = map(animals, make_df(.))) 2. withVisible(eval(quote(`_fseq`(`_lhs`)), env, env)) 3. eval(quote(`_fseq`(`_lhs`)), env, env) 4. eval(quote(`_fseq`(`_lhs`)), env, env) 5. `_fseq`(`_lhs`) 6. freduce(value, `_function_list`) 7. withVisible(function_list[[k]](value)) 8. function_list[[k]](value) 9. mutate(., ldf = map(animals, make_df(.))) 10. mutate.data.frame(., ldf = map(animals, make_df(.))) 11. as.data.frame(mutate(tbl_df(.data), ...)) 12. mutate(tbl_df(.data), ...) 13. mutate.tbl_df(tbl_df(.data), ...) 14. mutate_impl(.data, dots) 

當然,我可以用lapply制作這個數據框列表

dfs <- lapply(animals, make_df)

但是如果我嘗試將dfs和動物綁定到一個數據框中,我會得到一個看似相關的錯誤,同樣關於不同的行數。

 data.frame(animals, dfs)
 Error in data.frame(animals, dfs): arguments imply differing number of rows: 3, 5 Traceback: 1. data.frame(animals, dfs) 2. stop(gettextf("arguments imply differing number of rows: %s", . paste(unique(nrows), collapse = ", ")), domain = NA) 

顯然,我在這里缺少一些基本的東西。 為什么我無法手動將字符列表和數據框列表合並到一個數據框中,以及如何誤用purrr::map以便R遇到問題,大概是在我的函數中嘗試做同樣的事情。

你的語法有點偏,你要么使用map(animals, make_df)map(animals, ~ make_df(.))map的第二個參數需要是一個函數,它與lapply相同:

data.frame(animals) %>% mutate(ldf = map(animals, make_df)) %>% as.tibble()
# A tibble: 3 x 2
#  animals                  ldf
#   <fctr>               <list>
#1   sheep <data.frame [5 x 3]>
#2     cow <data.frame [5 x 3]>
#3   horse <data.frame [5 x 3]>

data.frame(animals) %>% mutate(ldf = map(animals, ~ make_df(.))) %>% as.tibble()
# A tibble: 3 x 2
#  animals                  ldf
#   <fctr>               <list>
#1   sheep <data.frame [5 x 3]>
#2     cow <data.frame [5 x 3]>
#3   horse <data.frame [5 x 3]>

或者,如果使用data.frame構造函數,則需要使用I創建列表類型列:

data.frame(animals, ldf = I(lapply(animals, make_df)))
#                         ^

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM