0

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

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]>

“LotsOfLists”列有一些由于连接而为 NULL 的列表。我想让 NULL 被最后一个列表替换。我希望它的工作方式与 zoo 包中的 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 答案不起作用。任何人都可以找到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)) 
4

2 回答 2

0

na.locf 的 tidyr 版本适用于列表。

test %>% 
fill(LotsOflist)
于 2017-01-12T15:43:19.900 回答
0

na.locf如果 NULL 被替换为 NA 值,则有效:

library(zoo)

test %>%
    mutate(LotsOflist = na.locf(replace(LotsOflist, sapply(LotsOflist, is.null), NA)))
于 2017-01-02T17:39:50.767 回答