使用 mutate 和 rowwise 返回列表

标签 r list function dplyr rowwise

我尝试使用 mutate 和 rowwise 返回一个列表,但出现代码中显示的错误。这些问题Q1 Q2有帮助,但我想通过使用 rowwise() 迭代行来保持简单,并且问题已经有 3 年 7 个月了。谢谢。

library(tidyverse)    
df <-  data.frame(Name=c("a","a","b","b","c"),X=c(1,2,3,4,5), Y=c(2,3,4,2,2))

    TestFn <- function(X,Y){
      Z <- list(X*5,Y/2,X+Y,X*2+5*Y)
      return (Z)
    }

    #this works
    SingleResult <- TestFn(5,20)

    #error - Error in mutate_impl(.data, dots) : incompatible size (4), expecting 1 (the group size) or 1
    dfResult <- df %>% 
      rowwise() %>% 
      mutate(R=TestFn(X,Y))

最佳答案

tidyverse 现在可以让您嵌套复杂的数据结构

tidyverse解决方案

df %>%
  mutate(copyX = X, copyY = Y) %>%
  nest(copyX, copyY) %>%
  mutate(data = map(data, ~TestFn(.x$copyX, .x$copyY)))

输出

    Name     X     Y       data
  <fctr> <dbl> <dbl>     <list>
1      a     1     2 <list [4]>
2      a     2     3 <list [4]>
3      b     3     4 <list [4]>
4      b     4     2 <list [4]>
5      c     5     2 <list [4]>

如何转换为数据框?

由于您的函数返回一个列表,因此我在取消嵌套之前添加了一个额外的步骤

df %>%
  mutate(copyX = X, copyY = Y) %>%
  nest(copyX, copyY) %>%
  mutate(data = map(data, ~TestFn(.x$copyX, .x$copyY))) %>%
  mutate(data = map(data, ~unlist(.x))) %>%
  unnest(data)

输出

     Name     X     Y  data
   <fctr> <dbl> <dbl> <dbl>
 1      a     1     2   5.0
 2      a     1     2   1.0
 3      a     1     2   3.0
 4      a     1     2  12.0
 5      a     2     3  10.0
 6      a     2     3   1.5
 # etc

关于使用 mutate 和 rowwise 返回列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46106423/

相关文章:

regex - gsub 模式值来表示帽子标志

r - 一个热编码向量列表

python - pandas:将列表转换为 int64index

javascript - JS addEventListener 参数

javascript - 在 javascript 自定义函数中添加默认值

javascript - jQuery:在执行 toggleClass 之后执行一个函数

r - 模拟相关伯努利数据

未从 Additional_repositories 安装 R 包依赖项

c++ - 使用迭代器从列表中打印结构值

python - 用于检查值是否在列表中的逻辑不适用于集合