用先前的非缺失值填充列,无ID

时间:2018-07-18 12:43:06

标签: r dplyr

我正尝试填充数据框的缺失ID列,如下所示。在它适用的第一行中,它不是空白,然后是空白,直到下一个ID。我编写了一个丑陋的代码来在for循环中执行此操作,但想知道是否有一种更整洁的方法来执行此操作。有什么建议吗?

这就是我所拥有的:

   code data
1     A    1
2          2
3          3
4          4
5          5
6          6
7          7
8          8
9          9
10        10
11    B   11
12        12
13        13
14        14
15        15
16    C   16
17        17
18        18
19        19
20        20

我想要:

   code data
1     A    1
2     A    2
3     A    3
4     A    4
5     A    5
6     A    6
7     A    7
8     A    8
9     A    9
10    A   10
11    B   11
12    B   12
13    B   13
14    B   14
15    B   15
16    C   16
17    C   17
18    C   18
19    C   19
20    C   20

我现在得到的代码:

# Create mock data frame
df <- data.frame(code = c("A", rep("", 9), 
                          "B", rep("", 4), 
                          "C", rep("", 4)), 
                 data = 1:20)

# For loop over rows (BAD!)
for (i in seq(2, nrow(df))) {
  df[i,]$code <- ifelse(df[i,]$code == "", df[i-1,]$code, df[i, ]$code)
}

1 个答案:

答案 0 :(得分:2)

有一种tidyr方法,有fill函数。您还需要用NA替换零长度的字符串,这样才能正常工作,您可以使用mutate中的na_ifdplyr函数轻松地做到这一点。

df %>% 
  mutate(code = na_if(code,"")) %>% 
  fill(code)

   code data
1     A    1
2     A    2
3     A    3
4     A    4
5     A    5
6     A    6
7     A    7
8     A    8
9     A    9
10    A   10
11    B   11
12    B   12
13    B   13
14    B   14
15    B   15
16    C   16
17    C   17
18    C   18
19    C   19
20    C   20