【发布时间】:2018-11-05 22:20:11
【问题描述】:
我有一个数据框,其中包含在行上重复的案例。有些行的数据比其他行更完整。我想对案例进行分组,然后将第一个非缺失值分配给该组该列中的所有 NA 单元格。这似乎是一个足够简单的任务,但我被困住了。我有有效的语法,但是当我尝试使用 apply 将代码应用于数据框中的所有列时,我得到一个列表而不是数据框。使用 do.call(rbind) 或 rbindlist 或 unlist 也不能完全解决问题。
这是语法。
df$groupid<-group_indices (df,id1,id2) #creates group id on the basis of a combination of two variables
df%<>%group_by(id1,id2) #actually groups the dataframe according to these variables
df<-summarise(df, xvar1=xvar1[which(!is.na(xvar1))[1]]) #this code works great to assign the first non missing value to all missing values but it only works on 1 column at a time (X1).
我有很多专栏,所以我尝试使用 apply 来使这成为一项易于管理的任务..
df<-apply(df, MARGIN=2, FUN=function(x) {summarise(df, x=x[which(!is.na(x))[1]])
}
)
这为我提供了每个变量的列表,我想要一个数据框(然后我将对其进行重复数据删除)。我尝试了 rbindlist 和 do.call(rbind),这些结果产生了一个只有 3 列的长数据框 - 两个 group_by 变量和“x”。
我知道问题只是我如何使用 apply,可能是使用 'which' 进行索引,但我很难过。
【问题讨论】:
-
“将第一个非缺失值分配给所有 NA 单元格” 听起来很像 “用最近的非 'NA' 替换每个 'NA'在它之前"来自
zoo::na.locf。我发现它更安全(至少在概念上)假设第一个值始终是最好的使用。您确定“最佳选择”始终是第一个而不是最近的非NA值吗? -
它们的日期和时间戳都完全相同,没有一个本身是“更新的”,但我很欣赏你的观点。这些数据是服务呼叫,虽然多个单元可以响应呼叫,但并非所有单元最终都会得到完整的数据。我将删除该文件,但希望在这样做之前保留尽可能多的信息。不过我要去看看 zoo 包!
标签: r list dataframe apply missing-data