【问题标题】:How can I use na.locf() for factor 'inputs'?如何将 na.locf() 用于因子“输入”?
【发布时间】:2019-11-16 22:57:42
【问题描述】:

我想根据该 ID 本身的前几年组的值将我的数据集的 NA 填充到组变量中。 na.locf(newData, na.rm = TRUE) 部分代码不起作用。我认为这是因为输入不是数字。或者是另一回事? 有谁知道如何解决这个问题?

  for (i in my_data$ID){
    newData = my_data[my_data$ID==i,c('ID','Year', 'group')][3]
    na.locf(newData,na.rm = TRUE)

  } 

我的数据集非常大。 但我提供了这个作为我需要的样本:

structure(list(ID = c(1L, 2L, 3L, 1L, 1L, 1L), Year = c(2000L, 
2000L, 2001L, 2001L, 2002L, 2003L), Group = structure(c(2L, 3L, 
2L, 1L, 1L, 4L), .Label = c("", "\"A\"", "\"B\"", "\"C\""), class = "factor")), row.names = c(NA, 
6L), class = "data.frame")

结果应该是这样的:

structure(list(ID = c(1L, 1L, 1L, 1L, 2L, 2L), Year = c(2000L, 
2001L, 2002L, 2003L, 2000L, 2002L), Group = structure(c(1L, 1L, 
1L, 3L, 2L, 2L), .Label = c("\"A\"", "\"B\"", "\"C\""), class = "factor")), row.names = c(NA, 
6L), class = "data.frame")

【问题讨论】:

    标签: r na


    【解决方案1】:

    正如我所说,您的问题只是您必须用 NA 替换空容器。

    with(replace(df, df == '', NA), ave(Group, ID, FUN = zoo::na.locf))
    #[1] "A" "B" "A" "A" "A" "C"
    

    将它附加到您的 df,

    df$Group <- with(replace(df, df == '', NA), ave(Group, ID, FUN = zoo::na.locf))
    

    给出,

      ID Year Group
    1  1 2000   "A"
    2  2 2000   "B"
    3  3 2001   "A"
    4  1 2001   "A"
    5  1 2002   "A"
    6  1 2003   "C"
    

    【讨论】:

    • omg!这是真的!它解决了我的问题。你现在明白为什么放置数据很聪明。问题不是我所期望的,我几天都在错误的部分上!感谢您的帮助和耐心。
    • 你是我的英雄 :)
    【解决方案2】:

    Base R,使用@Sotos 和/replace/ave 逻辑:

    df$Group <- with(replace(df, df == '', NA),
                      ave(Group, ID, FUN = function(x){na.omit(x)[cumsum(!is.na(x))]}))
    

    数据:

        df <- structure(
      list(
        ID = c(1L, 2L, 3L, 1L, 1L, 1L),
        Year = c(2000L,
                 2000L, 2001L, 2001L, 2002L, 2003L),
        Group = structure(
          c(2L, 3L,
            2L, 1L, 1L, 4L),
          .Label = c("", "\"A\"", "\"B\"", "\"C\""),
          class = "factor"
        )
      ),
      row.names = c(NA,
                    6L),
      class = "data.frame"
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-10
      • 1970-01-01
      • 2021-02-15
      • 1970-01-01
      • 2020-05-02
      • 2012-12-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多