r - 每列采样一行,大量缺失数据

标签 r if-statement dataframe data.table missing-data

作为我的数据框的示例,我将其称为 df1,我有包含三行数据的 GROUP1 和包含两行数据的 GROUP2。我有三个变量,X1、X2 和 X3:

GROUP          X1    X2   X3
GROUP1         A     NA   NA
GROUP1         NA    NA   T
GROUP1         C     T    G   
GROUP2         NA    NA   C
GROUP2         G     NA   T

根据之前的问题和答案 ( Sample a single row, per column, within a subset of a data frame in R, while following conditions ),除了我在使用字符时遇到问题外,我的答案已经完成了一半。

我想从 GROUP1 的每列中抽取一个变量,以创建一个新行来表示 GROUP1。我不想从 GROUP1 中抽取一个完整的行,而是需要对每一列单独进行抽样。我想为 GROUP2 做同样的事情。此外,抽样不应考虑/包括 NA,除非该组变量的所有行都具有 NA(例如上面的 GROUP2、变量 X2)。

例如,在采样之后,我可以得到这样的结果:

GROUP         X1    X2   X3
GROUP1        A     T    T
GROUP2        G     NA   C

只有 GROUP2,变量 X2,可以在此处产生 NA。我实际上有 300 个分类单元、40 个组、160000 个变量和大量 NA。

当我使用时:

library(data.table)

setDT(df1)[,lapply(.SD, function(x)
if(all(is.na(x))) NA_character_ else sample(na.omit(x),1)) , by = GROUP]

我最终得到一个警告:

Column 2 of result for group 2 is type 'character' but expecting type    
'integer'. Column types must be consistent for each group.

但是,这个警告似乎并不仅仅适用于那些完全由 NA 组成的组的变量。

如果我将 NA_character_ 替换为 NA_integer_,一些列会生成组变量的非 NA 行的总和,而不是跨行的样本。

最佳答案

您可以使用此 data.table 调用:

setDT(df1)[ , lapply(.SD, 
  function(x) x[!is.na(x)][sample(sum(!is.na(x)), 1)]), by = GROUP]

或者你可以调整你原来的

setDT(df1)[,lapply(.SD, function(x)
  if(all(is.na(x))) NA_character_ 
    else as.character(na.omit(x))[sample(length(na.omit(x)), 1)]) , by = GROUP]

或者使用来自 base R 的 aggregate:

aggregate(df1[ , names(df1) != "GROUP"], by=list(df1$GROUP), 
  function(ii) ifelse(length(na.omit(ii)) == 0, 
    NA,
    as.character(na.omit(ii))[sample(length(na.omit(ii)), 1)])) 
    # Note use of as.character in case of factors
#  Group.1 X1   X2 X3
#1  GROUP1  A    T  T
#2  GROUP2  G <NA>  C

正如 thelatemail 提到的,您遇到的问题很可能是由于变量是 factor,因为当 X1-X3 是字符时,您的代码有效。上述任何解决方案都应与 factors 一起使用。

关于r - 每列采样一行,大量缺失数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34711685/

相关文章:

r - 创建一个非正统的虚拟变量

R 编程brew 与Sweave——抑制输出和brew 限制

c# - If 语句在 C# 中不起作用

Python:Luhn 的算法/if 语句从不执行

python - 如何检查从 Pandas 数据框中选择的值是否在列表中?

r - 循环中的子集

r - 无法使用 dplyr::arrange() 对 r 中日期形式的列进行排序

c++ - 基于两个 bool 变量的分支

Python pandas : insert rows for missing dates, groupby 数据帧中的时间序列

python - pyspark 数据帧所有列中唯一元素的数量