如何使用随机选择创建新的VAR?

发布于 2025-02-12 07:59:33 字数 836 浏览 1 评论 0原文

使用dplyr,我想创建一个新变量new_regsiege,具有以下条件:

对于每行,如果regsiege ==“ xx”,则“ xx” > 0然后new_regsiege = regsiege

如果regsiege ==“ xx”和nbeta_regxx = 0,然后new_regsiege是在不是null的regsiege中随机选择的Regsiege之一。

这是我的例子:

mydf <- data.frame(
  regsiege = c("11","24","93"),
  nbeta_reg11 = c(0,1,0),
  nbeta_reg24 = c(1,1,0),
  nbeta_reg93 = c(1,1,1)
)

# Desired output
regsiege nbeta_reg11 nbeta_reg24 nbeta_reg93 new_regsiege
      11           0           1           1           93 (could be also "24")
      24           1           1           1           24
      93           0           0           1           93

我开始这样开始:

mydf %>% 
  rowwise()
  mutate(
    new_regsiege = if_else(...
  )

With dplyr, I would like to create a new variable new_regsiege with the following conditions:

For each line and "XX" if regsiege=="XX" and nbeta_regXX>0 then new_regsiege=regsiege

if regsiege=="XX" and nbeta_regXX=0 then new_regsiege is one of the regsiege randomly chosen among those which are not null.

Here's my example :

mydf <- data.frame(
  regsiege = c("11","24","93"),
  nbeta_reg11 = c(0,1,0),
  nbeta_reg24 = c(1,1,0),
  nbeta_reg93 = c(1,1,1)
)

# Desired output
regsiege nbeta_reg11 nbeta_reg24 nbeta_reg93 new_regsiege
      11           0           1           1           93 (could be also "24")
      24           1           1           1           24
      93           0           0           1           93

I started like this :

mydf %>% 
  rowwise()
  mutate(
    new_regsiege = if_else(...
  )

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

傻比既视感 2025-02-19 07:59:33

你可以尝试

library(tidyverse)

mydf %>%
  pivot_longer(-1, names_prefix = "nbeta_reg") %>%
  group_by(regsiege) %>%
  summarise(new_regsiege = if(value[regsiege == name] > 0) regsiege[1]
                           else sample(name[value > 0], 1)) %>%
  left_join(mydf, ., by = "regsiege")

#   regsiege nbeta_reg11 nbeta_reg24 nbeta_reg93 new_regsiege
# 1       11           0           1           1           93
# 2       24           1           1           1           24
# 3       93           0           0           1           93

You could try

library(tidyverse)

mydf %>%
  pivot_longer(-1, names_prefix = "nbeta_reg") %>%
  group_by(regsiege) %>%
  summarise(new_regsiege = if(value[regsiege == name] > 0) regsiege[1]
                           else sample(name[value > 0], 1)) %>%
  left_join(mydf, ., by = "regsiege")

#   regsiege nbeta_reg11 nbeta_reg24 nbeta_reg93 new_regsiege
# 1       11           0           1           1           93
# 2       24           1           1           1           24
# 3       93           0           0           1           93
芸娘子的小脾气 2025-02-19 07:59:33

最简单的解决方案将使用一个循环:

for (i in seq_len(nrow(mydf))) {
  cur_regsiege  <- mydf[i, "regsiege"]
  same          <- mydf[i, paste0("nbeta_reg", cur_regsiege)]
  mydf[i, "new_regsiege"] <- if (same) cur_regsiege else sample(mydf[-i, "regsiege"], 1L)
}

#   regsiege nbeta_reg11 nbeta_reg24 nbeta_reg93 new_regsiege
# 1       11           0           1           1           93
# 2       24           1           1           1           24
# 3       93           0           0           1           93

The simplest solution would use a loop:

for (i in seq_len(nrow(mydf))) {
  cur_regsiege  <- mydf[i, "regsiege"]
  same          <- mydf[i, paste0("nbeta_reg", cur_regsiege)]
  mydf[i, "new_regsiege"] <- if (same) cur_regsiege else sample(mydf[-i, "regsiege"], 1L)
}

#   regsiege nbeta_reg11 nbeta_reg24 nbeta_reg93 new_regsiege
# 1       11           0           1           1           93
# 2       24           1           1           1           24
# 3       93           0           0           1           93
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文