在以下条件下,在 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
。它会忽略所有 NA
s.
我使用 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))
作为我的数据示例,我在数据框中有包含三行数据的 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
。它会忽略所有 NA
s.
我使用 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))