r 根据条件随机分配 1 或 0

问题描述 投票:0回答:1

对于这样的数据集

    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")])
的选项,但这不起作用。任何建议都非常感激。预先感谢。

r dplyr duplicates data-transform
1个回答
0
投票

尚不清楚您是否会拥有两个以上

SubID
,或者您是否想要
0:1
采样 并更换。我假设总是
0:1
并且仅当组中的行数超过 2 时才使用替换。

dplyr

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

基础R

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))
© www.soinside.com 2019 - 2024. All rights reserved.