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

2024-01-02

我正在尝试在我的 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 完成吗?

Edit:

为了解决我的问题,示例中的 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 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.frames (or tibbles)由原始行中的行组成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现在定义为二元函数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

dplyr mutate - 如何将一行作为函数参数传递? 的相关文章

  • 更改 pander 中的默认对齐方式 (pandoc.table)

    我目前正在切换到pander对于我的大部分时间knitr markdown格式化 因为它提供了如此出色的pandoc支持 我不太满意的一件事是默认的居中对齐 营销人员可能会喜欢它 但对于技术报告来说这是一个可怕的事情 使用的最佳选择Hmis
  • 如何返回包含最大值标签的向量

    我有一个 4 列数组 我想获得一个向量 其中每行包含包含该行最大值的列的标签 我可以在循环中执行此操作 但我想使用矩阵函数来提高速度 我怎样才能在不编写自己的库函数的情况下做到这一点 有一个函数可以做到这一点 如果x是你的矩阵 尝试max
  • 使用 RDCOMClient 搜索 Outlook 收件箱

    我尝试使用 RDCOMClient 在 Outlook 收件箱中搜索电子邮件中的特定主题 然后获取附件 我在一封电子邮件上进行了这项工作 但由于主题包含日期元素 我需要搜索成为一个类似的子句 但不太清楚这适合我的下面的查询 outlook
  • R中整数类和数字类有什么区别

    我想先说我是一个绝对的编程初学者 所以请原谅这个问题是多么基本 我试图更好地理解 R 中的 原子 类 也许这适用于一般编程中的类 我理解字符 逻辑和复杂数据类之间的区别 但我正在努力寻找数字类和整数类之间的根本区别 假设我有一个简单的向量x
  • 手动设置scale_fill_distiller()的比例

    我正在尝试制作一系列图表进行比较 举例来说 我想使用iris数据集来制作这样的图 其中我已过滤以仅查看 setosa 物种 library ggplot2 library dplyr iris gt filter Species setos
  • 如何自动启动我的 ec2 实例、运行命令然后将其关闭?

    我想每周对 redshift postgres 数据库中的数据运行一次机器学习模型 我使用以下命令将 R 脚本设置为休息 apiplumbr然后我将其设置为一项任务来管理pm2 我有它 所以任务会在ec2实例启动然后继续运行 要让 R 脚本
  • 合并数据框而不重复行

    我想合并两个数据框 但如果有多个匹配项 则不想重复行 相反 我想总结一下那天的观察结果 来自 合并 提取两个数据框中与指定列匹配的行并将其连接在一起 如果有多个匹配项 则所有可能的匹配项各贡献一行 这是一些示例代码 days lt as d
  • 如何绘制堆积比例图?

    我有一个数据框 x lt data frame id letters 1 3 val0 1 3 val1 4 6 val2 7 9 id val0 val1 val2 1 a 1 4 7 2 b 2 5 8 3 c 3 6 9 我想绘制一个
  • 从 df 中提取具有两列的重叠行对

    我想找出这两个表之间哪些对重叠 gt dput data1 structure list Name x c MDH1 MDH1 IDH2 IDH2 IDH2 IDH2 IDH2 IDH2 IDH2 SCOALB SCOALB CSY4 CS
  • ubuntu中R的igraph包的安装

    我使用以下命令在 ubuntu 中安装 R 的 igraph 包 install packages igraph 但我收到一条错误消息 警告 无法访问存储库的索引 http ftp iitm ac in cran src contrib h
  • 融化R中的下半矩阵

    如何融化下半三角形加对角矩阵 11 NA NA NA NA 12 22 NA NA NA 13 23 33 NA NA 14 24 34 44 NA 15 25 35 45 55 A lt t matrix c 11 NA NA NA NA
  • R 将多个值与向量进行比较并返回向量[重复]

    这个问题在这里已经有答案了 我有一个向量 A 对于 A 的每个元素 我想检查它是否等于第二个向量 Targets 中的任何元素 我想要一个逻辑值向量 其长度为 A 作为返回 也提到了同样的问题here http r 789695 n4 na
  • 获取函数的命名空间

    我正在开发一个包 我希望在其中向对象添加编辑历史记录 该包允许其他包注册用于编辑对象的函数 我正在寻找一种方法来记录注册用于编辑的函数的包的版本 问题是 给定一个函数 如何从导出的位置获取包 我的想法是调查它的搜索路径 但是search 仅
  • 跟踪循环迭代

    抛硬币 成功 你赢100 否则你输50 你会一直玩 直到你口袋里有钱a 的价值如何a在任何迭代中都被存储 a lt 100 while a gt 0 if rbinom 1 1 0 5 1 a lt a 100 else a lt a 50
  • 从 n,k 维矩阵数组中减去 n,k 维矩阵

    如果我有一个数组A A lt array 0 c 4 3 5 for i in 1 5 set seed i A i lt matrix rnorm 12 4 3 如果我有矩阵 B set seed 6 B lt matrix rnorm
  • 为什么数据帧上的 is.vector 不返回 TRUE?

    tl dr R 中的向量到底是什么 长版 R 中很多东西都是向量 例如 数字是长度为 1 的数值向量 is vector 1 1 TRUE 列表也是一个向量 is vector list 1 1 TRUE 好的 所以列表是一个向量 显然 数
  • 将 ftransform 与折叠 R 包中的 fgroup_by 一起使用

    我正在尝试重现以下输出dplyr代码与R包裹collapse dplyr Code library tidyverse starwars gt select name mass species gt group by species gt
  • R - 计算 bin 中特定值的数量

    我有一个如下所示的数据框 df Value lt c 1 1 0 2 1 3 4 0 0 1 2 0 3 0 4 5 2 3 0 6 Sl lt c 1 20 df lt data frame Sl Value gt df Sl Value
  • 在R中循环子文件夹

    我正在 R 环境中包含多个子文件夹的文件夹中工作 我想要循环遍历多个子文件夹 然后在每个子文件夹中调用 R 脚本来执行 我想出了下面的代码 但我的代码似乎添加了 到子文件夹列表 我收到错误 文件中的错误 文件名 r 编码 编码 无效的 描述
  • 实现 XGboost 自定义目标函数

    我正在尝试使用 XGboost 实现自定义目标函数 在 R 中 但我也使用 python 所以有关 python 的任何反馈也很好 我创建了一个返回梯度和粗麻布的函数 它工作正常 但是当我尝试运行 xgb train 时它不起作用 然后 我

随机推荐