【问题标题】:How to make a conditional variable based on multiple variables?如何根据多个变量制作条件变量?
【发布时间】:2021-12-16 17:58:27
【问题描述】:

尝试使所有变量都包含在内 - 因此,如果受访者对 9 个是/否变量中的至少一个回答“是”,那么它们将被置于整体变量中的“是”类别中。

我是这样做的:

overallvariable <- ifelse(df$v1 == "yes" | df$v2 == "yes" | df$v3 == "yes" | df$v4 == "yes" |df$v5 == "yes" | df$v6 == "yes" | df$v7 == "yes" | df$v8 == "yes" | df$v9 == "yes", "yes", "no")

但是table(overallvariable) 提出:

no
##

而不是

yes no
### ##

感谢您的帮助!

注意:在我添加 v9 之前,一切似乎都可以正常工作 注意:刚刚玩弄了 v9 的位置,它似乎不是附加到变量的问题,因为它产生了我需要的输出。所以添加第九个条件似乎是个问题。

【问题讨论】:

  • 请通过dput(head(yourdata))提供部分数据。
  • 对不起,我对 R 很陌生,这是什么意思?
  • 如果你提供一个最小的例子,你最有可能得到答案。您可以将部分数据粘贴到问题中:dput(head(df))。然后人们可以轻松地使用您的数据来获得答案。
  • how to create a reproducible examplev9 和其他的有什么不同?
  • 不幸的是,我使用的数据受到道德和协议的约束,不允许我分享:/

标签: r if-statement conditional-statements


【解决方案1】:

这里是data.table 方法,以及如何创建一些示例数据的限制;-)

样本数据

set.seed(123)
mydata <- data.frame(id = 1:15,
                     v1 = sample(c("yes", "no"), 15, replace = TRUE),
                     v2 = sample(c("yes", "no"), 15, replace = TRUE),
                     v3 = sample(c("yes", "no"), 15, replace = TRUE),
                     v4 = sample(c("yes", "no"), 15, replace = TRUE))

代码

library(data.table)
# convert to data.table formast
setDT(mydata)
# columns to look in
cols <- grep("v[1-4]", names(mydata), value = TRUE)
# initialise overallvariable to "no"
mydata[, overallvariable := "no"]
# if 1 or more columns in cols have the value "yes", set overallvariable to "yes"
mydata[ rowSums(mydata[, ..cols] == "yes", na.rm = TRUE) >= 1, 
        overallvariable := "yes"]

输出

# id  v1  v2  v3  v4 overallvariable
# 1:  1 yes yes yes yes             yes
# 2:  2 yes  no  no yes             yes
# 3:  3 yes yes yes  no             yes
# 4:  4  no yes  no yes             yes
# 5:  5 yes yes  no yes             yes
# 6:  6  no yes yes  no             yes
# 7:  7  no  no yes yes             yes
# 8:  8  no yes yes yes             yes
# 9:  9 yes yes yes yes             yes
#10: 10 yes yes  no yes             yes
#11: 11  no yes yes  no             yes
#12: 12  no  no  no  no              no
#13: 13  no  no  no yes             yes
#14: 14 yes yes yes  no             yes
#15: 15  no  no yes yes             yes

【讨论】:

    【解决方案2】:

    基础R:

    df$overallvariable <- c('no','yes')[1 + (rowSums(df == "yes") > 0)]
    

    数据:

    df <- structure(list(V1 = c("no", "no", "no", "no", "no", "no", "no", 
    "no", "no", "no"), V2 = c("yes", "yes", "yes", "no", "no", "no", 
    "yes", "no", "yes", "yes"), V3 = c("yes", "yes", "yes", "no", 
    "no", "no", "yes", "no", "yes", "yes"), V4 = c("no", "no", "no", 
    "no", "no", "no", "no", "no", "no", "no"), V5 = c("yes", "yes", 
    "yes", "no", "no", "no", "yes", "no", "yes", "yes"), V6 = c("no", 
    "no", "no", "no", "no", "no", "no", "no", "no", "no"), V7 = c("no", 
    "no", "no", "no", "no", "no", "no", "no", "no", "no"), V8 = c("yes", 
    "yes", "yes", "no", "no", "no", "yes", "no", "yes", "yes"), V9 = c("no", 
    "no", "no", "no", "no", "no", "no", "no", "no", "no"), V10 = c("no", 
    "no", "no", "no", "no", "no", "no", "no", "no", "no")), class = "data.frame", row.names = c(NA, 
    -10L))
    

    【讨论】:

      【解决方案3】:

      dplyr 包具有完美的功能,可实现所需的转换:if_any

      library(dplyr)
      
      df %>% mutate(overallvariable = if_any(V1:V10, ~ .x=='yes') %>% ifelse('yes', 'no'))
      

      我们也可以使用purrr::reduce

      library(purrr)
      library(dplyr)
      
      df %>% mutate(overallvariable = reduce(across(V1:V10, ~.x=='yes'), `|`) %>% ifelse('yes', 'no'))
      

      输出使用来自@TarJae的数据:

         V1  V2  V3 V4  V5 V6 V7  V8 V9 V10 overallvariable
      1  no yes yes no yes no no yes no  no             yes
      2  no yes yes no yes no no yes no  no             yes
      3  no yes yes no yes no no yes no  no             yes
      4  no  no  no no  no no no  no no  no              no
      5  no  no  no no  no no no  no no  no              no
      6  no  no  no no  no no no  no no  no              no
      7  no yes yes no yes no no yes no  no             yes
      8  no  no  no no  no no no  no no  no              no
      9  no yes yes no yes no no yes no  no             yes
      10 no yes yes no yes no no yes no  no             yes
      

      【讨论】:

        猜你喜欢
        • 2023-02-25
        • 1970-01-01
        • 1970-01-01
        • 2012-09-01
        • 1970-01-01
        • 2013-04-15
        • 2019-09-27
        • 2020-10-08
        • 1970-01-01
        相关资源
        最近更新 更多