如何在列表列上应用函数并在 dplyr 和 purrr 中返回另一个函数?

adv*_*nce 2 r dplyr purrr

我想获取列表列中每个向量的前 5 个值,并将其作为保存为列表的数据框中的新列返回。

\n\n
structure(list(sample_num = 1:6, vector = list(c(0, 1, 1, 0, \n1, 2, 0, 0, 3, 0), c(0, 0, 1, 2, 0, 0, 4, 10, 12, 1), c(1, 33, \n4, 4, 2, 2, 6, 9, 14, 2), c(0, 0, 1, 0, 1, 0, 1, 5, 3, 0), c(0, \n1, 1, 0, 0, 0, 1, 4, 3, 0), c(0, 0, 1, 0, 0, 0, 1, 1, 1, 0))), class = c("tbl_df", \n"tbl", "data.frame"), row.names = c(NA, -6L), .Names = c("sample_num", \n"vector"))\n\n> test\n# A tibble: 6 \xc3\x97 2\n  sample_num     vector\n       <int>     <list>\n1          1 <dbl [10]>\n2          2 <dbl [10]>\n3          3 <dbl [10]>\n4          4 <dbl [10]>\n5          5 <dbl [10]>\n6          6 <dbl [10]>\n
Run Code Online (Sandbox Code Playgroud)\n\n

我尝试使用 lmap 但收到错误消息

\n\n
> test  %>% lmap(.$vector,.f = function(x) x[1:5])\nError in .f(.x[i], ...) : \n  unused argument (list(c(0, 1, 1, 0, 1, 2, 0, 0, 3, 0), c(0, 0, 1, 2, 0, 0, 4, 10, 12, 1), c(1, 33, 4, 4, 2, 2, 6, 9, 14, 2), c(0, 0, 1, 0, 1, 0, 1, 5, 3, 0), c(0, 1, 1, 0, 0, 0, 1, 4, 3, 0), c(0, 0, 1, 0, 0, 0, 1, 1, 1, 0)))\n
Run Code Online (Sandbox Code Playgroud)\n\n

谢谢你!

\n

Nic*_*ker 5

这就是你想要做的吗?

\n\n
structure(list(sample_num = 1:6, vector = list(c(0, 1, 1, 0, \n1, 2, 0, 0, 3, 0), c(0, 0, 1, 2, 0, 0, 4, 10, 12, 1), c(1, 33, \n4, 4, 2, 2, 6, 9, 14, 2), c(0, 0, 1, 0, 1, 0, 1, 5, 3, 0), c(0, \n1, 1, 0, 0, 0, 1, 4, 3, 0), c(0, 0, 1, 0, 0, 0, 1, 1, 1, 0))), class = c("tbl_df", \n"tbl", "data.frame"), row.names = c(NA, -6L), .Names = c("sample_num", \n"vector"))\n\ntest$new = lapply(test$vector, function(x) {x[1:5]})\ntest\n\n# A tibble: 6 \xc3\x97 3\n  sample_num     vector       new\n       <int>     <list>    <list>\n1          1 <dbl [10]> <dbl [5]>\n2          2 <dbl [10]> <dbl [5]>\n3          3 <dbl [10]> <dbl [5]>\n4          4 <dbl [10]> <dbl [5]>\n5          5 <dbl [10]> <dbl [5]>\n6          6 <dbl [10]> <dbl [5]>\n\n\ntest$vector[3]\n[[1]]\n [1]  1 33  4  4  2  2  6  9 14  2\n\ntest$new[3]\n[[1]]\n[1]  1 33  4  4  2\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果要使用 dplyr 语法,请先定义一个函数:

\n\n
f = function(x) {\n    return(list(x[1:5]))\n    }\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后,将其按行应用到列vector

\n\n
test = test %>%\n    rowwise() %>%\n    mutate(new_dplyr = f(vector))\n\ntest\n# A tibble: 6 \xc3\x97 3\n  sample_num     vector new_dplyr\n       <int>     <list>    <list>\n1          1 <dbl [10]> <dbl [5]>\n2          2 <dbl [10]> <dbl [5]>\n3          3 <dbl [10]> <dbl [5]>\n4          4 <dbl [10]> <dbl [5]>\n5          5 <dbl [10]> <dbl [5]>\n6          6 <dbl [10]> <dbl [5]>\n\ntest$vector[3]\n[[1]]\n [1]  1 33  4  4  2  2  6  9 14  2\n\ntest$new_dplyr[3]\n[[1]]\n[1]  1 33  4  4  2\n
Run Code Online (Sandbox Code Playgroud)\n