首页 文章

如何将tibble列中的向量扩展到同一个tibble中的多个列?

提问于
浏览
1

下面的代码在最后一列中生成一个长度为6的向量,从该列我想在我的tibble中提取6个新列 .

require(tidyverse)
require(purrrlyr)
# this function will return a vector of the same length (6) for each group
fun=function(X,Y){
   mycut<-cut(X,breaks=seq(50,350,by=50),right=FALSE)
   v<-tapply(Y,mycut,sum)
   return(v)
}
# use the previous function to count gears per class of hp
mtcars %>%
    group_by(cyl)  %>%   
    by_slice(~fun(.x$hp,.x$gear)) %>%
    rename(cut=.out)

在这里,我的列切割中有一个向量

# tibble [3 x 2]
     cyl       cut
  <fctr>    <list>
1      4 <dbl [6]>
2      6 <dbl [6]>
3      8 <dbl [6]>

从这个向量传递给像这样的表需要什么命令?

cyl  [50,100) [100,150) [150,200) [200,250) [250,300) [300,350) 
   4     36         9        NA        NA        NA        NA 
   ...

unnest 不起作用 . 我是否必须使用 by_row 或者是否有更简单的答案?

2 回答

  • 1

    我们需要将'cut'变量的 names 作为新列,然后在 list 元素之后执行 spread 重塑为'wide'格式

    mtcars %>%
       group_by(cyl)  %>%   
       by_slice(~fun(.x$hp,.x$gear)) %>%
       rename(cut=.out) %>%
       mutate(Names = map(cut, ~factor(names(.x), levels = names(.x)))) %>%
       unnest %>%
       spread(Names, cut)
    # A tibble: 3 x 7
    #    cyl `[50,100)` `[100,150)` `[150,200)` `[200,250)` `[250,300)` `[300,350)`
    #*  <dbl>      <dbl>       <dbl>       <dbl>       <dbl>       <dbl>       <dbl>
    #1     4         36           9          NA          NA          NA          NA
    #2     6         NA          22           5          NA          NA          NA
    #3     8         NA          NA          21          15           5           5
    
  • 1

    我会建议另一种方法 . 您可以使用以下代码,而不是使用已弃用的 by_slice() 函数(现在在purrrlyr包中重复使用):

    mtcars %>% 
      split(.$cyl) %>% 
      map(~fun(.x$hp,.x$gear)) %>% 
      do.call(rbind, .)
    

    这给出了以下输出

    [50,100) [100,150) [150,200) [200,250) [250,300) [300,350)
    4       36         9        NA        NA        NA        NA
    6       NA        22         5        NA        NA        NA
    8       NA        NA        21        15         5         5
    

相关问题