在以下条件下,在 R 中的数据框的子集中对每列的单行进行采样

Sample a single row, per column, within a subset of a data frame in R, while following conditions

作为我的数据示例,我在数据框中有包含三行数据的 GROUP 1 和包含两行数据的 GROUP 2:

GROUP   VARIABLE 1   VARIABLE 2   VARIABLE 3 
    1            2            6            5 
    1            4           NA            1 
    1           NA            3            8
    2            1           NA            2      
    2            9           NA           NA 

我想从第 1 组的每列中抽样一个变量,以生成代表第 1 组的新行。我不想从第 1 组中抽样一个完整的行,而是抽样需要每列单独发生。我想对 GROUP 2 做同样的事情。此外,采样不应 consider/include NA,除非该组变量的所有行都有 NA(例如上面的 GROUP 2,VARIABLE 2)。

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

GROUP   VARIABLE 1   VARIABLE 2   VARIABLE 3 
    1            4            6            1 
    2            9           NA            2 

只有 GROUP 2,VARIABLE 2,才能在此处产生 NA。我实际上有 39 个组,50,000 多个变量,以及相当数量的 NA。我真诚地感谢代码来制作一个新的行数据框,每一行都有每组的采样结果。

我们可以使用data.table。将 'data.frame' 转换为 'data.table' (setDT(df1)),按 'GROUP' 分组,我们遍历列 (lapply(.SD,),if all 的元素是 NA 我们 return NA 否则我们得到 sample 的非 NA 元素。

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

要忽略 NA,只需将一个参数传递给汇总函数 na.rm = TRUE。它会忽略所有 NAs.

我使用 dplyr 来执行请求的分组,但您也可以使用基本函数。 dplyr 易于使用和阅读。

下面是代码

如果所有列的汇总函数都相同,您可以使用 summarise_each 并一次性进行分组。

library(dplyr)

    df = df %>%
      group_by(Group) %>%
      summarise(Var_1 = max(Var_1, na.rm = TRUE),Var_2 = max(Var_2, na.rm = TRUE),Var_3 = min(Var_3, na.rm = TRUE))