最后一个对象在具有列表中的列的列中前进

时间:2017-01-02 17:09:39

标签: r tidyverse

我正在寻找一个函数来帮助填充包含具有先前值的列表的列的元素。

library(tidyverse)

test <- right_join(
data_frame (Numbers = c(1,3,5,10),
          LotsOflist = c(list(A=1),
                         list(B=2),
                         list(C=3),
                         list(D=4)
                         )),
data_frame(Numbers = 1:10))

test 

# A tibble: 10 × 2
      Numbers LotsOflist
       <dbl>     <list>
1        1  <dbl [1]>
2        2     <NULL>
3        3  <dbl [1]>
4        4     <NULL>
5        5  <dbl [1]>
6        6     <NULL>
7        7     <NULL>
8        8     <NULL>
9        9     <NULL>
10      10  <dbl [1]>

专栏&#34; LotsOfLists&#34;有一些由于连接而为NULL的列表。我想将NULL替换为最后一个列表。我希望它的工作方式类似于动物园包中的na.locf(),它填充NA并且最后一个对象结转,但找不到任何适用于列的列。

test2 <- data_frame(LotsOfNumbers = c(1,2,NA,NA,NA,7))
test2

# A tibble: 6 × 1
       LotsOfNumbers
            <dbl>
1             1
2             2
3            NA
4            NA
5            NA
6             7
library(zoo)

test2 %>% 
  mutate(LotsOfNumbers_Filled = na.locf(LotsOfNumbers))

# A tibble: 6 × 2
        LotsOfNumbers LotsOfNumbers_Filled
            <dbl>                <dbl>
1             1                    1
2             2                    2
3            NA                    2
4            NA                    2
5            NA                    2
6             7                    7

编辑:

原来的问题得到了回答,但事实证明,如果专栏有数据框架,那么答案就不起作用了。有人能找到data.frames的解决方案吗?

 test <- right_join( data_frame (Numbers = c(1,3,5,10),
                            LotsOflist = c(list(data.frame(A=1)), 
                                           list(data.frame(B=2)), 
                                           list(data.frame(C=3)),
                                           list(data.frame(D=4)) )),
                data_frame(Numbers = 1:10)) 

2 个答案:

答案 0 :(得分:0)

如果将NULL替换为NA值,则

na.locf起作用:

library(zoo)

test %>%
    mutate(LotsOflist = na.locf(replace(LotsOflist, sapply(LotsOflist, is.null), NA)))

答案 1 :(得分:0)

na.locf的tidyr版本与列表一起使用。

test %>% 
fill(LotsOflist)