如何使用dplyr mutate从输入一列到返回一个列表的函数中创建新的列?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用dplyr mutate从输入一列到返回一个列表的函数中创建新的列?相关的知识,希望对你有一定的参考价值。
我知道这个标题很拗口。我有一个返回列表的函数。我想使用dplyr mutate将列中的每个值通过函数输入,并将返回的列表中的项目放入新的列中。
我的例子是:我可以让函数返回一个数据。
library(dplyr)
my_df <- data_frame(filename = c("file1","file2","file3","file4"),
digits_only = c("10101010", "11011011", "10011000","11111111"))
compress_it_list <- function(txt)
len.raw <- sum(nchar(txt))
len.xz <- length(memCompress(txt, "x"))
len.gz <- length(memCompress(txt, "g"))
len.bz2 <- length(memCompress(txt, "b"))
return(list("len_raw" = len.raw,
"len_xz" = len.xz,
"len_gz" = len.gz,
"len_bz2" = len.bz2,
"min_compression" = min(c(len.raw, len.xz, len.gz, len.bz2))))
我可以让函数返回一个数据框架 但我想我也会遇到同样的问题。
compress_it_df <- function(txt)
len.raw <- sum(nchar(txt))
len.xz <- length(memCompress(txt, "x"))
len.gz <- length(memCompress(txt, "g"))
len.bz2 <- length(memCompress(txt, "b"))
return(data_frame("len_raw" = len.raw,
"len_xz" = len.xz,
"len_gz" = len.gz,
"len_bz2" = len.bz2,
"min_compression" = min(c(len.raw, len.xz, len.gz, len.bz2))))
我试图找出一些类似于以下的方法。
new_df <- my_df %>%
mutate_at(.vars = digits_only, .funs = compress_it_list)
答案
这里,我们可以选择 unnest_wider
library(dplyr)
library(tidyr)
library(purrr)
my_df %>%
mutate(new = map(digits_only, compress_it_list)) %>%
unnest_wider(c(new))
# A tibble: 4 x 7
# filename digits_only len_raw len_xz len_gz len_bz2 min_compression
# <chr> <chr> <int> <int> <int> <int> <int>
#1 file1 10101010 8 60 12 39 8
#2 file2 11011011 8 60 13 39 8
#3 file3 10011000 8 60 16 39 8
#4 file4 11111111 8 64 11 39 8
以上是关于如何使用dplyr mutate从输入一列到返回一个列表的函数中创建新的列?的主要内容,如果未能解决你的问题,请参考以下文章
dplyr 中的 mutate_each / summarise_each:如何选择某些列并为变异列赋予新名称?
你能让 dplyr::mutate 和 dplyr::lag 默认 = 自己的输入值吗?