【问题标题】:apply resulting in list instead of dataframe应用导致列表而不是数据框
【发布时间】: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


【解决方案1】:

如何将lapplydo.callcbind 一起使用,如下所示:

df <- do.call(cbind, lapply(df, function(x) {summarise(df, x=x[which(!is.na(x))[1]])}))

【讨论】:

  • 一种有趣的方法,但似乎不太奏效。这些列似乎标记为 x1,x2,xn,其中 n 是原始文件中的列数。分组变量 id1 和 id2 也重复 n 次。它是如此接近,可能会被清理工作,但我只是不知道如何。
  • 我尝试在其中使用“paste0”和“summary”命令来获取要匹配的变量的名称(事实上,它只是“x”)但这不起作用。我遇到了这个问题之前和核心问题是我没有找到一个好的方法来引用向量的“名称”而不是向量的“内容”。我觉得 paste 已经解决了以前的问题,但似乎没有在这里工作
猜你喜欢
  • 2017-02-04
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 2014-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多