概率依赖于另一列的样本函数
Sample function with probabilities dependent on another column
我正在使用 R 并想随机分配一个状态给行,概率取决于特定的列值。
我的 table(称为 df)看起来像这样:
Year Level Country
2018 1 Eng
2018 2 Wal
2018 1 Eng
2019 3 Sco
等... 共有三个可能的级别 (1,2,3),所有年份介于 2011 年和 2022 年之间,以及许多国家/地区。行可以重复,有几千行。
我想添加一个新列,其值为 TRUE 或 FALSE。我有一个单独的 table(称为表 1)告诉我每年应该有多少个真值:
2018 2019 2020 2021 2022
123 100 99 189 211
但是,只有具有特定条件的行才能获得 TRUE 值 - 它们必须从 2018 年开始,它们的国家必须为 Eng,如果年份是 2018 则它们的级别为 2(其他年级别无关紧要)。
我希望原来的 table 为所有行添加这个附加列,其中每年的 TRUE 数与表 1 中的数相匹配。
我尝试过各种方法。我开始尝试将带有“&”的条件与 sample() 函数结合使用。
newtable <- df$Country == "Eng" &
df$Level = 2 &
df$Year >= 2018 &
sample(c(T,F),nrows(df),replace=T,prob=c(???))
但后来陷入了不同年份的概率差异,以及如何将表 1 中的原始数字转换为概率的问题。
我还对如何对 2018 年应用略有不同的过滤器(仅限 2 级)感到困惑 - 我可以使用这个 dplyr:filter `
filter(!(Year==2018 and Level!=2))
但我不确定如何将其合并到我的上述函数中。
`
非常感谢任何帮助。
要指示哪些行有资格被分配 TRUE
,您可以使用以下表达式
df$eligible <- (df$Year > 2018 & df$Country == "Eng") |
(df$Year == 2018 & df$Country == "Eng" & df$Level == 2)
表示如果 Year
严格大于 2018 年(即 2019 年或更大)的行是合格的 并且 Country
是 "Eng" , OR Year
是 2018 and Country
是 "Eng" and Level
是 2.
现在,在符合条件的行中分配 TRUE
s。有几种方法可以做到这一点。一种方法是将符合条件的行按 Year
拆分,并根据 table.
中的值分配 TRUE
s
eligible <- df[df$eligible, ]
trues <- c(123, 100, 99, 189, 211)
现在,使用 mapply
:
new_df <- mapply(FUN = function(x, n) {
x$new_column <- FALSE
x$new_column[sample(1:nrow(x), n)] <- TRUE
x
}, x = split(eligible, eligible$Year), n = trues, SIMPLIFY = FALSE)
我们创建了一个函数,它接受两个参数:符合条件的行的数据帧,以及该数据帧的 TRUE
数量,以及 returns 具有随机分配的新列的数据帧 TRUE
秒。 mapply
然后将 split(eligible, eligible$Year)
(包含五个数据框的列表,每个对应于 2018 年至 2022 年之间的一年)和 trues
(包含五个元素的向量)的值与函数并行应用.
结束,
new_df <- do.call(rbind, new_df)
new_df <- rbind(new_df, cbind(df[!df$eligible, ], new_column = FALSE))
我们将 mapply(...)
(包含五个数据帧的列表)的输出行绑定在一起,然后 rbind
将其绑定到不符合条件的行,并在值所在的位置附加新列,根据定义,FALSE
.
我正在使用 R 并想随机分配一个状态给行,概率取决于特定的列值。
我的 table(称为 df)看起来像这样:
Year Level Country
2018 1 Eng
2018 2 Wal
2018 1 Eng
2019 3 Sco
等... 共有三个可能的级别 (1,2,3),所有年份介于 2011 年和 2022 年之间,以及许多国家/地区。行可以重复,有几千行。
我想添加一个新列,其值为 TRUE 或 FALSE。我有一个单独的 table(称为表 1)告诉我每年应该有多少个真值:
2018 2019 2020 2021 2022
123 100 99 189 211
但是,只有具有特定条件的行才能获得 TRUE 值 - 它们必须从 2018 年开始,它们的国家必须为 Eng,如果年份是 2018 则它们的级别为 2(其他年级别无关紧要)。
我希望原来的 table 为所有行添加这个附加列,其中每年的 TRUE 数与表 1 中的数相匹配。
我尝试过各种方法。我开始尝试将带有“&”的条件与 sample() 函数结合使用。
newtable <- df$Country == "Eng" &
df$Level = 2 &
df$Year >= 2018 &
sample(c(T,F),nrows(df),replace=T,prob=c(???))
但后来陷入了不同年份的概率差异,以及如何将表 1 中的原始数字转换为概率的问题。
我还对如何对 2018 年应用略有不同的过滤器(仅限 2 级)感到困惑 - 我可以使用这个 dplyr:filter `
filter(!(Year==2018 and Level!=2))
但我不确定如何将其合并到我的上述函数中。 `
非常感谢任何帮助。
要指示哪些行有资格被分配 TRUE
,您可以使用以下表达式
df$eligible <- (df$Year > 2018 & df$Country == "Eng") |
(df$Year == 2018 & df$Country == "Eng" & df$Level == 2)
表示如果 Year
严格大于 2018 年(即 2019 年或更大)的行是合格的 并且 Country
是 "Eng" , OR Year
是 2018 and Country
是 "Eng" and Level
是 2.
现在,在符合条件的行中分配 TRUE
s。有几种方法可以做到这一点。一种方法是将符合条件的行按 Year
拆分,并根据 table.
TRUE
s
eligible <- df[df$eligible, ]
trues <- c(123, 100, 99, 189, 211)
现在,使用 mapply
:
new_df <- mapply(FUN = function(x, n) {
x$new_column <- FALSE
x$new_column[sample(1:nrow(x), n)] <- TRUE
x
}, x = split(eligible, eligible$Year), n = trues, SIMPLIFY = FALSE)
我们创建了一个函数,它接受两个参数:符合条件的行的数据帧,以及该数据帧的 TRUE
数量,以及 returns 具有随机分配的新列的数据帧 TRUE
秒。 mapply
然后将 split(eligible, eligible$Year)
(包含五个数据框的列表,每个对应于 2018 年至 2022 年之间的一年)和 trues
(包含五个元素的向量)的值与函数并行应用.
结束,
new_df <- do.call(rbind, new_df)
new_df <- rbind(new_df, cbind(df[!df$eligible, ], new_column = FALSE))
我们将 mapply(...)
(包含五个数据帧的列表)的输出行绑定在一起,然后 rbind
将其绑定到不符合条件的行,并在值所在的位置附加新列,根据定义,FALSE
.