首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在R中的管道中使用dplyr的rowwise()来应用向每一行返回列表的函数?

如何在R中的管道中使用dplyr的rowwise()来应用向每一行返回列表的函数?
EN

Stack Overflow用户
提问于 2017-09-25 18:00:31
回答 1查看 1.4K关注 0票数 1

我想使用dplyr的rowwise()和管道对dataframe中的每一行应用一个函数(返回一个列表)。

包含两行的测试数据集:

代码语言:javascript
运行
复制
test_tbl <- tibble(a=c(2, 4), b=c(0, 8), c=c(5, -3))

定义一个简单的函数(它是关于一个函数返回一个列表,显然不是关于添加8):

代码语言:javascript
运行
复制
simple_function <- function(input) {
  list(input + 8)
}

这就是我想要实现的:

代码语言:javascript
运行
复制
apply(test_tbl ,1, function (x) simple_function(x))

它返回一个包含2个列表的列表(我想要的输出)。

我想将这些列表保存为tibble中的一个列。我们可以这样做:

代码语言:javascript
运行
复制
test_tbl %>% mutate(output = apply(. ,1, function (x) simple_function(x)))

我宁愿使用dplyr,也不愿将dplyr、base和管道混为一谈(也是为了代码的可读性),但我不明白为什么这不起作用:

代码语言:javascript
运行
复制
test_tbl %>% rowwise() %>% simple_function
test_tbl %>% rowwise() %>% mutate(output = simple_function(.))

这两个函数都将函数应用于整个数据帧,而不是单独的行。我认为:test_tbl %>% rowwise() %>% simple_function (在输出方面)与test_tbl %>% simple_function相同是没有意义的

这确实提供了所需的输出,但我发现它相当冗长,而且我必须自己绑定列,这并不理想:

代码语言:javascript
运行
复制
test_tbl %>% rowwise() %>% do(output= simple_function(.)) %>% bind_cols(test_tbl, .)

任何关于rowwise()失败原因的帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

发布于 2017-09-25 18:14:21

如果我们需要对每一行执行此操作,则在map中执行split并应用该函数

代码语言:javascript
运行
复制
library(tidyverse)
test_tbl %>% 
    split(., seq_len(nrow(.))) %>%
    map(simple_function)
#$`1`
#$`1`[[1]]
#   a b  c
#1 10 8 13


#$`2`
#$`2`[[1]]
#   a  b c
#1 12 16 5
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46402462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档