对于这样的数据集
MainID SubID DOB BMI
1234 1234_A Feb-19-2024 10.1
1235 1235_A Jan-11-2023 17.23
1235 1235_B Jan-11-2023 19.11
5136 5136_A May-17-2021 21.87
5136 5136_B May-17-2021 14.18
5136 5136_C May-17-2021 18.11
3357 3357-A Oct-06-2023 24.10
9124 9124-B July-01-2021 12.09
9124 9124-B July-01-2021 15.06
仅当 MainID 和 DOB 中的值相同且 SubID 不同时,我才尝试随机分配值 0 或 1。期待这样的数据集
MainID SubID DOB BMI Col1
1234 1234_A Feb-19-2024 10.1 0
1235 1235_A Jan-11-2023 17.23 0
1235 1235_B Jan-11-2023 19.11 1
3357 3357-A Oct-06-2023 24.10 0
5136 5136_A May-17-2021 21.87 0
5136 5136_B May-17-2021 14.18 1
5136 5136_C May-17-2021 18.11 1
9124 9124-B July-01-2021 12.09 0
9124 9124-B July-01-2021 15.06 0
此处仅将 ID 为 1235 和 5136 的行分配为 0 或 1,因为重复的行具有相同的 MainID、DOB 和不同的 SubID。
我尝试了
ifelse
和 duplicated(df[c("MainID", "DOB")])
的选项,但这不起作用。任何建议都非常感激。预先感谢。
尚不清楚您是否会拥有两个以上
SubID
,或者您是否想要 0:1
采样 并更换。我假设总是 0:1
并且仅当组中的行数超过 2 时才使用替换。
library(dplyr)
set.seed(42)
quux |>
mutate(
Col1 = if (n_distinct(SubID) > 1) {
sample(0:1, size = n(), replace = (n() > 2))
} else 0,
.by = c(MainID, DOB)
)
# MainID SubID DOB BMI Col1
# 1 1234 1234_A Feb-19-2024 10.10 0
# 2 1235 1235_A Jan-11-2023 17.23 0
# 3 1235 1235_B Jan-11-2023 19.11 1
# 4 5136 5136_A May-17-2021 21.87 0
# 5 5136 5136_B May-17-2021 14.18 0
# 6 5136 5136_C May-17-2021 18.11 1
# 7 3357 3357-A Oct-06-2023 24.10 0
# 8 9124 9124-B July-01-2021 12.09 0
# 9 9124 9124-B July-01-2021 15.06 0
ave(seq_len(nrow(quux)), quux[, c("MainID", "DOB")],
FUN = function(ind) {
nr <- length(ind)
nsub <- length(unique(quux$SubID[ind]))
if (nsub > 1) sample(0:1, size = nr, replace=(nr > 2)) else 0
})
# [1] 0 0 1 0 0 1 0 0 0
数据
quux <- structure(list(MainID = c(1234L, 1235L, 1235L, 5136L, 5136L, 5136L, 3357L, 9124L, 9124L), SubID = c("1234_A", "1235_A", "1235_B", "5136_A", "5136_B", "5136_C", "3357-A", "9124-B", "9124-B"), DOB = c("Feb-19-2024", "Jan-11-2023", "Jan-11-2023", "May-17-2021", "May-17-2021", "May-17-2021", "Oct-06-2023", "July-01-2021", "July-01-2021"), BMI = c(10.1, 17.23, 19.11, 21.87, 14.18, 18.11, 24.1, 12.09, 15.06)), class = "data.frame", row.names = c(NA, -9L))