如何将 na.locf() 用于因子“输入”?

som*_*adi 2 r na

我想根据该 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)

  } 
Run Code Online (Sandbox Code Playgroud)

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

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")
Run Code Online (Sandbox Code Playgroud)

结果应该是这样的:

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")
Run Code Online (Sandbox Code Playgroud)

Sot*_*tos 5

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

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

将其附加回您的 df,

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

这使,

  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"
Run Code Online (Sandbox Code Playgroud)

  • 天哪!这是真的!它解决了我的问题。你现在我明白为什么放置数据是明智的。问题不是我所期望的,几天来我一直关注错误的部分!感谢您的帮助和耐心。 (2认同)
  • 你是我的英雄 :) (2认同)