【问题标题】:Return value from row if multiple conditions are true如果多个条件为真,则从行返回值
【发布时间】:2019-10-31 16:07:20
【问题描述】:

我有以下虚拟 Df:

structure(list(lat = c(15.04166667, 15.125, 15.29166667, 15.375, 
15.04166667, 15.125, 15.20833333, 15.29166667, 15.375, 15.45833333, 
15.54166667, 14.95833333, 15.04166667, 15.125, 15.20833333, 15.29166667, 
15.375, 15.45833333, 15.54166667, 15.625, 15.70833333, 15.79166667, 
15.875, 16.54166667, 13.875, 14.875, 14.95833333), lon = c(48.95833333, 
48.95833333, 48.95833333, 48.95833333, 48.875, 48.875, 48.875, 
48.875, 48.875, 48.875, 48.875, 48.79166667, 48.79166667, 48.79166667, 
48.79166667, 48.79166667, 48.79166667, 48.79166667, 48.79166667, 
48.79166667, 48.79166667, 48.79166667, 48.79166667, 48.79166667, 
48.70833333, 48.70833333, 48.70833333), Var1 = c(40L, 40L, 40L, 
40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 
40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L, 40L), Var2 = c(29.76510459, 
6.480850609, 223.0983795, 203.8934788, 11.27195619, 65.76071468, 
194.8171225, 262.4171485, 171.163622, 240.1846431, 239.8467942, 
53.94738807, 49.07189175, 118.194278, 218.744134, 313.4466307, 
185.409121, 252.8829675, 219.123076, 211.2351477, 279.0554084, 
260.621935, 169.9482421, 337.1199379, 9.932910029, 96.11876075, 
69.54847552), Var3 = c(6.24087876, 1.358846252, 46.77725586, 
42.75054481, 2.363402045, 13.78811339, 40.84749728, 55.02126264, 
35.88804325, 50.35974897, 50.28891223, 12.29369073, 10.28895202, 
24.78191063, 45.86429711, 65.72066044, 38.87491352, 53.02222021, 
45.94375161, 44.28987901, 58.50982373, 54.64485812, 35.63321409, 
70.68427011, 1.731396537, 20.15331521, 14.58229774), Var4 = c(173.4664468, 
173.4706729, 173.4790964, 173.4833057, 173.4077614, 173.4117034, 
173.4156335, 173.4195758, 173.4235096, 173.4266725, 164.1875386, 
239.5356333, 173.3490717, 173.3527418, 173.3563883, 173.3600476, 
173.3637073, 173.3667678, 164.1276972, 164.1295668, 164.1308363, 
164.1321065, 164.1333879, 167.3271206, 150.2922712, 224.8818893, 
224.8852899), Var5 = c(19.62146524, 19.62146505, 19.62146589, 
19.62146616, 19.62146629, 19.62146473, 19.62146495, 19.62146552, 
19.62146614, 19.62146513, 16.76539618, 38.78913858, 19.62146615, 
19.62146541, 19.62146505, 19.62146575, 19.62146599, 19.62146573, 
16.76539594, 16.76539677, 16.7653963, 16.76539632, 16.76539658, 
17.25115902, 11.78819987, 34.82506079, 34.82506128), var6 = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = "High", class = "factor"), 
    var7 = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
    1L, 1L), .Label = "HIGH RISK", class = "factor")), class = "data.frame", row.names = c(NA, 
-27L))

我想要做的是创建一个名为 var8 的新变量,仅当 Var6 为“高”且 Var7 为“高风险”时才返回 Var2,否则不返回任何内容。请注意,var6 和 var7 具有示例中未提供的其他因素(例如 Low、Medium、SAFE..)。

我试过这个,但它返回 TRUE 或 FALSE 值,而我只需要 VAR 2 中的值以防它为 TRUE 和 0 以防它为 FALSE。

  df<- df %>% 
        mutate( Area.HRH=Var6 =="High"  & 
        (Var7== "HIGH RISK"))

谢谢!

【问题讨论】:

    标签: r if-statement dplyr


    【解决方案1】:

    我想你想使用if_else()

    library(dplyr)
    
    df %>% 
      mutate(Area.HRH = if_else(var6 =="High" & var7== "HIGH RISK", Var2, NULL))
    

    您可以轻松更改您希望 FALSE 标准返回的内容。这将返回零而不是 NULL

    df %>% 
      mutate(Area.HRH = if_else(var6 =="High" & var7== "HIGH RISK", Var2, 0))
    

    【讨论】:

    • OP 说 "and 0 if it is FALSE",建议用0替换NULL
    • 是的,但它也说“否则什么都不返回”。所以我选了一个。感谢您的评论。我会进行编辑。
    • @亚当。谢谢!我在找什么!
    【解决方案2】:

    这可以在基础R 中通过单个ifelse() 语句来解决。

    df$var8 <- ifelse(df[, "var6"] == "High" & df[, "var7"] == "HIGH RISK",
                      df[, "Var2"],
                      0)
    

    【讨论】:

    • &lt;- inside ifelse 不起作用。使用ifelse是一个返回结果的函数---你需要分配结果。 df$var8 &lt;- ifelse(..., df$Var2, 0)。 (内部分配是如何与if(){}else{} 一起工作,但这不是矢量化的,所以ifelse() 在这里更好。)
    • 这是一个幸运的错误,它起作用了——只是因为 OP 的示例数据不包含任何 FALSE 值。 ifelse() 函数首先检查条件,对于 OP 的样本数据,条件始终为真,因此 ifelse 忽略 FALSE 参数并运行 TRUE 参数 df$var8 &lt;- df[, "Var2"]。返回此结果,并且由于代码包含赋值,因此进行了赋值。但是,如果 OP 的数据包含不满足条件的单个项目,则需要 TRUEFALSE 参数并将按此顺序运行...
    • 首先是df$var8 &lt;- df[, "Var2"],然后是df$var8 &lt;- 0ifelse() 将根据条件参数将结果放入向量中,并返回正确的结果(打印在控制台上,因为它们没有赋值),但是由于 ifelse 的结果没有赋值,就好像你刚刚运行了这两条赋值行,首先是df$var8 &lt;- df$var2,然后是df$var8 &lt;- 0 ---如果你查看df,所有var8 的值都是0。
    • 用玩具例子自己看看:df = data.frame(a = 1:3); ifelse(df$a &lt; 2, df$b &lt;- 0, df$b &lt;- 1); df
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 2012-10-12
    • 2013-05-04
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多