R:使用tidyr清理数据表,其中包含结构缺失和冗余数据

时间:2015-03-18 23:28:22

标签: r tidyr

仍然试图抓住tidyr个套餐。如果一个数据集包含冗余行,如下所示:

require(dplyr)
require(tidyr)
data <-
      data.frame(
        v1 = c("ID1", NA, "ID2", NA),
        v2 = c("x", NA, "xx", NA),
        v3 = c(NA, "z", NA, "zz"),
        v4 = c(22, 22, 6, 6),
        v5 = c(5, 5, 9, 9)) %>%
      tbl_df()

> data
Source: local data frame [4 x 5]

   v1 v2 v3 v4 v5
1 ID1  x NA 22  5
2  NA NA  z 22  5
3 ID2 xx NA  6  9
4  NA NA zz  6  9

由于id变量v1 - v3被分成具有许多NA的冗余行(因此两次测量也会重复),所以希望得到如下内容:

    v1  v2  v3  v4  v5
1   ID1 x   z   22  5
2   ID2 xx  zz  6   9

使用tidyr获取此功能的一般方法是什么?我觉得可以用gather()来完成,但是怎么做?

2 个答案:

答案 0 :(得分:2)

一种方式是这样的。使用na.locf()包中的zoo,我替换了v1中的NAs。然后,我使用变量对数据进行分组。我再次使用na.locf()来照顾v3。最后,我在v2中删除了包含NA的行。

library(zoo)
library(dplyr)

mutate(data, v1 = na.locf(v1)) %>%
group_by(v1) %>%
mutate(v3 = na.locf(v3, fromLast = TRUE)) %>%
filter(complete.cases(v2)) %>%
ungroup

#   v1 v2 v3 v4 v5
#1 ID1  x  z 22  5
#2 ID2 xx zz  6  9

答案 1 :(得分:2)

您也可以

library(dplyr)
data %>% 
     mutate(v3=v3[!is.na(v3)][cumsum(is.na(v3))]) %>%
     na.omit()
#    v1 v2 v3 v4 v5
#1 ID1  x  z 22  5
#2 ID2 xx zz  6  9

或根据显示的数据

 data %>% 
      mutate(v3=lead(as.character(v3))) %>% 
      na.omit()