【问题标题】:multiple if conditions in rr中的多个if条件
【发布时间】:2018-10-05 12:46:26
【问题描述】:

我一直在努力解决这个问题,但未能解决。我知道答案可能很简单,但我无法解决它,也无法从其他类似问题中找到如何解决它。

我有以下data.frame:

region    group   probs1   probs2   probs3   probs4     weights
   1        2       0.2       0.3     0.4       0.1        NA
   2        4       0.3       0.4     0.15      0.15       NA
   3        3       0.4       0.1     0.3       0.2        NA
   4        1       0.7       0.1     0.1       0.1        NA
   5        1       0.2       0.3     0.4       0.1        NA
   6        2       0.6       0.1     0.1       0.2        NA
   7        3       0.7       0.1     0.1       0.1        NA
   8        4       0.3       0.2     0.1       0.4        NA
   9        3       0.2       0.1     0.1       0.6        NA
  10        1       0.1       0.2     0.1       0.6        NA

我要做的是在 data.frame 中创建一个名为“weights”的新列,其计算方式为 group==1,然后 weights=probs1/probs1。如果组==2,那么权重=probs1/probs2。如果组==3,那么权重=probs1/probs3。如果 group==4,那么 weights=probs1/probs4。

我使用了不同类型的代码,例如ifelseif....elsedplyr,但我失败了。事实上,可能代码只为 weights=probs1/probs1 创建权重并将其应用于所有区域,而不管组。

有人可以帮我解决吗? 谢谢

【问题讨论】:

    标签: r for-loop if-statement


    【解决方案1】:

    您可以使用dplyr::case_when

    library(dplyr)
    df %>%
        mutate(weights = case_when(
            group == 1 ~ probs1 / probs1,
            group == 2 ~ probs1 / probs2,
            group == 3 ~ probs1 / probs3,
            TRUE ~ probs1 / probs4))
    #   region group probs1 probs2 probs3 probs4   weights
    #1       1     2    0.2    0.3   0.40   0.10 0.6666667
    #2       2     4    0.3    0.4   0.15   0.15 2.0000000
    #3       3     3    0.4    0.1   0.30   0.20 1.3333333
    #4       4     1    0.7    0.1   0.10   0.10 1.0000000
    #5       5     1    0.2    0.3   0.40   0.10 1.0000000
    #6       6     2    0.6    0.1   0.10   0.20 6.0000000
    #7       7     3    0.7    0.1   0.10   0.10 7.0000000
    #8       8     4    0.3    0.2   0.10   0.40 0.7500000
    #9       9     3    0.2    0.1   0.10   0.60 2.0000000
    #10     10     1    0.1    0.2   0.10   0.60 1.0000000
    

    样本数据

    df <- read.table(text =
        "region    group   probs1   probs2   probs3   probs4     weights
       1        2       0.2       0.3     0.4       0.1        NA
       2        4       0.3       0.4     0.15      0.15       NA
       3        3       0.4       0.1     0.3       0.2        NA
       4        1       0.7       0.1     0.1       0.1        NA
       5        1       0.2       0.3     0.4       0.1        NA
       6        2       0.6       0.1     0.1       0.2        NA
       7        3       0.7       0.1     0.1       0.1        NA
       8        4       0.3       0.2     0.1       0.4        NA
       9        3       0.2       0.1     0.1       0.6        NA
      10        1       0.1       0.2     0.1       0.6        NA", header = T)
    

    【讨论】:

    • 它有效。谢谢。但是,我的 data.frame 太大了。我只是提供了一个非常简短的示例。而且,我只是看不到数据框中的任何变化。我的意思是,我的 data.frame 中的 wights 仍然是 NA。
    • 事实上,我的问题是谁能在我的 data.table 中而不是在控制台中看到它?
    • @Eshmel 您需要将dplyr 链保存为新对象,就像在基本 R 中一样:df.new &lt;- df %&gt;% mutate(...)。我不确定您所说的 data.frame 太大是什么意思。这适用于任意数量的行。
    • 我使用相同的方法为这些组创建变量的平均值,如下所示:
    • 我使用相同的方法为这 4 个组创建变量(中间人群)的平均值。代码的主要部分是这样的:groupadmit == 1 ~ mean(mid_pop) 对其他四个组重复了(就像上面的代码一样)。但是,它再次为所有行(观察)的第一组创建了平均值。我的你也请帮我解决这个问题吗?非常感谢您。
    【解决方案2】:

    你可以尝试dplyr 包来解决这个问题,尽管没有它也是可能的。

    library(dplyr)
    
    data_frame <- data_frame %>%
      mutate(
        weights = ifelse(group==1,probs1/probs1,
                  ifelse(group==2,probs1/probs2,
                  ifelse(group==3,probs1/probs3,
                  ifelse(group==4,probs1/probs4,NA))))
      )
    
    print(data_frame)
    

    【讨论】:

      猜你喜欢
      • 2019-07-01
      • 2017-06-25
      • 2014-09-06
      • 2015-04-21
      • 2016-01-20
      • 2015-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多