【问题标题】:R: use tidyr to clean-up data table with structural missing and redundant dataR:使用tidyr清理结构缺失和冗余数据的数据表
【发布时间】:2015-03-18 23:28:21
【问题描述】:

我仍在尝试使用tidyrpackages。如果一个数据集包含这样的冗余行:

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() 来完成,但是怎么做呢?

【问题讨论】:

    标签: r tidyr


    【解决方案1】:

    一种方法是这样的。使用zoo 包中的na.locf(),我替换了v1 中的NA。然后,我使用变量对数据进行分组。我又雇用了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
    

    【讨论】:

      【解决方案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()
      

      【讨论】:

      • 一如既往的简洁。 :) 我需要通过阅读你的答案来调整我的大脑。
      • @jazzurro 谢谢,但我没有用其他案例测试它。目前尚不清楚特定 ID 的 NA 行是否始终跟随该 ID。例如,第 1 行和第 2 行交换位置的可能性..
      • 啊,你两个都解决了!让我思考如何首先摆脱结构性 NA(在使用许多 var-val 对执行 tidyr::spread() 之后) - 解决方案是 spread() 中的 id 参数。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-17
      • 2014-11-17
      相关资源
      最近更新 更多