gpt4 book ai didi

r - dplyr mutate - 如何将一行作为函数参数传递?

转载 作者:行者123 更新时间:2023-12-02 17:15:02 31 4
gpt4 key购买 nike

我正在尝试在我的 tibble 中创建一个新列,该列收集并格式化在所有其他列中找到的所有单词。如果可能的话,我想使用 dplyr 来做到这一点。原始数据框:

df <- read.table(text =      "  columnA     columnB      
1 A Z
2 B Y
3 C X
4 D W
5 E V
6 F U " )

作为一个简化的例子,我希望做这样的事情:

df %>%
rowwise() %>%
mutate(newColumn = myFunc(.))

输出如下:

       columnA     columnB      newColumn
1 A Z AZ
2 B Y BY
3 C X CX
4 D W DW
5 E V EV
6 F U FU

当我在我的代码中尝试这样做时,输出如下所示:

       columnA     columnB      newColumn
1 A Z ABCDEF
2 B Y ABCDEF
3 C X ABCDEF
4 D W ABCDEF
5 E V ABCDEF
6 F U ABCDEF

myFunc 应该将一行作为参数,但是当我尝试使用 rowwise() 时,我似乎将整个 tibble 传递给函数(我可以通过将打印函数添加到 myFunc 中看到这一点)。

我怎样才能只传递一行并迭代地执行此操作,以便将函数应用于每一行?这可以用 dplyr 完成吗?

编辑:

为了我的问题,示例中的 myFunc 被简化了。实际功能如下所示:

get_chr_vector <- function(row) {

row <- row[,2:ncol(row)] # I need to skip the first row
words <- str_c(row, collapse = ' ')
words <- str_to_upper(words)
words <- unlist(str_split(words, ' '))
words <- words[words != '']
words <- words[!nchar(words) <= 2]
words <- removeWords(words, stopwords_list) # from the tm library
words <- paste(words, sep = ' ', collapse = ' ')
}

最佳答案

看看 ?dplyr::do?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 列现在包含 1x2 data.frame(或 tibble),由原始 数据中的行组成.框架。您现在可以使用 map 将每一个传递给您的自定义 myFunc

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 列现在根据需要包含应用于原始 data.frame 中每一行的 myFunc 的输出。您可以通过连接 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)

编辑:因为您的原始 data.frame 只包含两列,您实际上可以跳过 do 步骤并使用 purrr::map2 代替。语法与 map 非常相似:

myFunc <- function( a, b ) {paste0(a,b)}
df %>% mutate( Result = map2( columnA, columnB, myFunc ) )

请注意,myFunc 现在被定义为二元函数。

关于r - dplyr mutate - 如何将一行作为函数参数传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46850278/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com