[英]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.