看一眼?dplyr::do
and ?purrr::map
,它允许您将任意函数应用于任意列,并通过多个一元运算符链接结果。例如,
df1 <- df %>% rowwise %>% do( X = as_data_frame(.) ) %>% ungroup
# # A tibble: 6 x 1
# X
# * <list>
# 1 <tibble [1 x 2]>
# 2 <tibble [1 x 2]>
# ...
注意该栏X
现在包含 1x2data.frame
s (or tibble
s)由原始行中的行组成data.frame
。您现在可以将每一项传递给您的自定义myFunc
using map
.
myFunc <- function(Y) {paste0( Y$columnA, Y$columnB )}
df1 %>% mutate( Result = map(X, myFunc) )
# # A tibble: 6 x 2
# X Result
# <list> <list>
# 1 <tibble [1 x 2]> <chr [1]>
# 2 <tibble [1 x 2]> <chr [1]>
# ...
Result
列现在包含的输出myFunc
应用于原始文件中的每一行data.frame
, 如预期的。您可以通过连接来检索值tidyr::unnest
手术。
df1 %>% mutate( Result = map(X, myFunc) ) %>% unnest
# # A tibble: 6 x 3
# Result columnA columnB
# <chr> <fctr> <fctr>
# 1 AZ A Z
# 2 BY B Y
# 3 CX C X
# ...
如果需要的话,unnest
可以限制为特定列,例如unnest(Result)
.
EDIT: 因为你原来的data.frame
仅包含两列,您实际上可以跳过do
步骤及使用purrr::map2
反而。语法非常类似于map
:
myFunc <- function( a, b ) {paste0(a,b)}
df %>% mutate( Result = map2( columnA, columnB, myFunc ) )
注意myFunc
现在定义为二元函数。