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

如何在列表列上应用一个函数并在dplyr和purrr中返回另一个函数?,r,dplyr,purrr,R,Dplyr,Purrr,我想获取列表列中每个向量的前5个值,并在保存为列表的数据框中将其作为新列返回 structure(list(sample_num = 1:6, vector = 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,

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

structure(list(sample_num = 1:6, vector = 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))), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -6L), .Names = c("sample_num", 
"vector"))

> test
# A tibble: 6 × 2
  sample_num     vector
       <int>     <list>
1          1 <dbl [10]>
2          2 <dbl [10]>
3          3 <dbl [10]>
4          4 <dbl [10]>
5          5 <dbl [10]>
6          6 <dbl [10]>

谢谢大家!

这就是你想要做的吗

structure(list(sample_num = 1:6, vector = 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))), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -6L), .Names = c("sample_num", 
"vector"))

test$new = lapply(test$vector, function(x) {x[1:5]})
test

# A tibble: 6 × 3
  sample_num     vector       new
       <int>     <list>    <list>
1          1 <dbl [10]> <dbl [5]>
2          2 <dbl [10]> <dbl [5]>
3          3 <dbl [10]> <dbl [5]>
4          4 <dbl [10]> <dbl [5]>
5          5 <dbl [10]> <dbl [5]>
6          6 <dbl [10]> <dbl [5]>


test$vector[3]
[[1]]
 [1]  1 33  4  4  2  2  6  9 14  2

test$new[3]
[[1]]
[1]  1 33  4  4  2
然后,将其按行应用于列
vector

test = test %>%
    rowwise() %>%
    mutate(new_dplyr = f(vector))

test
# A tibble: 6 × 3
  sample_num     vector new_dplyr
       <int>     <list>    <list>
1          1 <dbl [10]> <dbl [5]>
2          2 <dbl [10]> <dbl [5]>
3          3 <dbl [10]> <dbl [5]>
4          4 <dbl [10]> <dbl [5]>
5          5 <dbl [10]> <dbl [5]>
6          6 <dbl [10]> <dbl [5]>

test$vector[3]
[[1]]
 [1]  1 33  4  4  2  2  6  9 14  2

test$new_dplyr[3]
[[1]]
[1]  1 33  4  4  2
test=test%>%
行()
变异(新的_dplyr=f(载体))
测验
#一个tibble:6×3
样本数向量新值
1          1  
2          2  
3          3  
4          4  
5          5  
6          6  
测试$vector[3]
[[1]]
[1]  1 33  4  4  2  2  6  9 14  2
测试$new\u dplyr[3]
[[1]]
[1]  1 33  4  4  2

这就是你想要做的吗

structure(list(sample_num = 1:6, vector = 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))), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -6L), .Names = c("sample_num", 
"vector"))

test$new = lapply(test$vector, function(x) {x[1:5]})
test

# A tibble: 6 × 3
  sample_num     vector       new
       <int>     <list>    <list>
1          1 <dbl [10]> <dbl [5]>
2          2 <dbl [10]> <dbl [5]>
3          3 <dbl [10]> <dbl [5]>
4          4 <dbl [10]> <dbl [5]>
5          5 <dbl [10]> <dbl [5]>
6          6 <dbl [10]> <dbl [5]>


test$vector[3]
[[1]]
 [1]  1 33  4  4  2  2  6  9 14  2

test$new[3]
[[1]]
[1]  1 33  4  4  2
然后,将其按行应用于列
vector

test = test %>%
    rowwise() %>%
    mutate(new_dplyr = f(vector))

test
# A tibble: 6 × 3
  sample_num     vector new_dplyr
       <int>     <list>    <list>
1          1 <dbl [10]> <dbl [5]>
2          2 <dbl [10]> <dbl [5]>
3          3 <dbl [10]> <dbl [5]>
4          4 <dbl [10]> <dbl [5]>
5          5 <dbl [10]> <dbl [5]>
6          6 <dbl [10]> <dbl [5]>

test$vector[3]
[[1]]
 [1]  1 33  4  4  2  2  6  9 14  2

test$new_dplyr[3]
[[1]]
[1]  1 33  4  4  2
test=test%>%
行()
变异(新的_dplyr=f(载体))
测验
#一个tibble:6×3
样本数向量新值
1          1  
2          2  
3          3  
4          4  
5          5  
6          6  
测试$vector[3]
[[1]]
[1]  1 33  4  4  2  2  6  9 14  2
测试$new\u dplyr[3]
[[1]]
[1]  1 33  4  4  2

这使用一个紧凑的调用序列。我第一次尝试使用“[”,就像我在lapply或sapply用法中使用的一样,但需要使用backticks才能成功:

> test$new <- map(test$vector,.f = `[`,  1:5)
> test
# A tibble: 6 × 3
  sample_num     vector       new
       <int>     <list>    <list>
1          1 <dbl [10]> <dbl [5]>
2          2 <dbl [10]> <dbl [5]>
3          3 <dbl [10]> <dbl [5]>
4          4 <dbl [10]> <dbl [5]>
5          5 <dbl [10]> <dbl [5]>
6          6 <dbl [10]> <dbl [5]>
>测试$new测试
#一个tibble:6×3
样本数向量新
1          1  
2          2  
3          3  
4          4  
5          5  
6          6  

这使用了一个紧凑的调用序列。我第一次尝试使用“[”作为lapply或sapply的用法,但需要反勾号才能成功:

> test$new <- map(test$vector,.f = `[`,  1:5)
> test
# A tibble: 6 × 3
  sample_num     vector       new
       <int>     <list>    <list>
1          1 <dbl [10]> <dbl [5]>
2          2 <dbl [10]> <dbl [5]>
3          3 <dbl [10]> <dbl [5]>
4          4 <dbl [10]> <dbl [5]>
5          5 <dbl [10]> <dbl [5]>
6          6 <dbl [10]> <dbl [5]>
>测试$new测试
#一个tibble:6×3
样本数向量新
1          1  
2          2  
3          3  
4          4  
5          5  
6          6  

是的!我想我在定义匿名函数时错过了{}。有没有其他方法可以使用管道操作?是的!我想我在定义匿名函数时错过了{}。有没有其他方法可以使用管道操作?