【问题标题】:Add missing value in column with value from row above在上面行的值的列中添加缺失值
【发布时间】:2012-03-01 10:27:12
【问题描述】:

每周我都会使用不完整的数据集进行分析。看起来像:

df1 <- data.frame(var1 = c("a","","","b",""), 
             var2 = c("x","y","z","x","z"))

缺少一些 var1 值。数据集最终应如下所示:

df2 <- data.frame(var1 = c("a","a","a","b","b"), 
             var2 = c("x","y","z","x","z"))

目前我使用 Excel 宏来执行此操作。但这使得分析自动化变得更加困难。从现在开始,我想在 R 中执行此操作。但我不知道如何执行此操作。

感谢您的帮助。

评论后的问题更新

var2 与我的问题无关。我唯一想做的就是。从 df1 到 df2。

df1 <- data.frame(var1 = c("a","","","b",""))
df2 <- data.frame(var1 = c("a","a","a","b","b"))

【问题讨论】:

  • 我不明白您用来替换缺失值的模式。你想用'a'替换第一组空白直到'b'然后用'b'替换空白直到'c'等等......
  • 很抱歉给您带来了困惑。 var2 根本与问题无关。我会更新我的问题。
  • 我添加了tidyr包v0.3.0 fill()。这正是我想要的。

标签: r


【解决方案1】:

这是一种使用游程编码 (rle) 及其逆rle.inverse 的方法:

fillTheBlanks <- function(x, missing=""){
  rle <- rle(as.character(x))
  empty <- which(rle$value==missing)
  rle$values[empty] <- rle$value[empty-1] 
  inverse.rle(rle)
}

df1$var1 <- fillTheBlanks(df1$var1)

结果:

df1

  var1 var2
1    a    x
2    a    y
3    a    z
4    b    x
5    b    z

【讨论】:

  • 谢谢,这就是我要找的答案。
  • 非常有用,谢谢安德烈!我根据自己的需要对此进行了调整并产生了一个怪物(可能很危险),但要记录在案:pastebin.com/82kvNp1D
【解决方案2】:

这是一个更简单的方法:

library(zoo)
df1$var1[df1$var1 == ""] <- NA
df1$var1 <- na.locf(df1$var1)

【讨论】:

    【解决方案3】:

    tidyr 包具有 fill() 函数,可以解决问题。

    df1 <- data.frame(var1 = c("a",NA,NA,"b",NA), stringsAsFactors = FALSE)
    df1 %>% fill(var1)
    

    【讨论】:

      【解决方案4】:

      这是另一种略短且不强制字符的方式:

      Fill <- function(x,missing="")
      {
        Log <- x != missing
        y <- x[Log]
        y[cumsum(Log)]
      }
      

      结果:

      # For factor:
      Fill(df1$var1)
      [1] a a a b b
      Levels:  a b
      
      # For character:
      Fill(as.character(df1$var1))
      [1] "a" "a" "a" "b" "b"
      

      【讨论】:

        【解决方案5】:

        下面是我的unfill函数,遇到了同样的问题,希望对你有帮助。

        unfill <- function(df,cols){
          col_names <- names(df)
          unchanged <- df[!(names(df) %in% cols)]
          changed <- df[names(df) %in% cols] %>%
            map_df(function(col){
              col[col == col %>% lag()] <- NA
              col
            })
          unchanged %>% bind_cols(changed) %>% select(one_of(col_names))
        }
        
        

        【讨论】:

          猜你喜欢
          • 2017-11-09
          • 2020-02-19
          • 2018-06-11
          • 2015-05-29
          • 1970-01-01
          • 2021-05-08
          • 1970-01-01
          • 2021-12-29
          • 1970-01-01
          相关资源
          最近更新 更多