【问题标题】:R (dplyr/tidyverse) | Using mutate_at to construct a series of new variables using if_else statementsR (dplyr/tidyverse) |使用 mutate_at 使用 if_else 语句构造一系列新变量
【发布时间】:2018-12-12 05:55:50
【问题描述】:

我对这个网站和编程世界还比较陌生,所以如果有人问过这个问题,我深表歉意。

这是我目前正在使用的数据框的修改版本(截断以使事情更容易诊断):

  COUNTRY          b_2010 c_2010 b_2011  c_2011   
1 Australia          50     62     67     56     
2 Austria            50     48     48     95      
3 Belgium            50     26     67     25      
4 Bulgaria           50     54     42     64      

假设我想创建一系列变量,表明一个国家/地区的值等于或大于 50,每个现有变量在给定年份

我可以通过运行这样的东西来做到这一点:

dataframe %>% mutate(d_2010 = if_else(b_2010 & c_2010 >= 50, "A", "B"),
                     d_2011 = if_else(b_2011 & c_2011 >= 50, "A", "B"))

这应该会产生我想要构建的指标变量,但如果我有一个冗长的时间序列,这个过程会变得非常繁琐。我确信有一种方法可以更有效地执行此操作(使用 mutate_at 或其他一些函数),但我无法弄清楚。

有人可以帮帮我吗?

谢谢!

【问题讨论】:

    标签: r if-statement tidyverse dplyr


    【解决方案1】:

    在我看来,“给定年份中的每个现有变量”应该是这样的:

    dataframe %>% mutate(d_2010 = if_else(b_2010 >= 50 & c_2010 >= 50, "A", "B"),
                         d_2011 = if_else(b_2011 >= 50 & c_2011 >= 50, "A", "B"))
    

    如果这是目标,那么我将在第一步计算新变量,然后将它们加入原始数据帧。像这样的:

    df <- dataframe %>% 
      gather(starts_with("b_"), starts_with("c_"), key = Key , value = Value) %>% 
      mutate(Year = paste0("d_"str_sub(Key, 3, 6))) %>% # creat your new variable 
      group_by(COUNTRY, Year) %>% 
      summarise(d =  ifelse(prod(Value >=50), "A", "B")) %>% # calculate the value
      spread(Year, d)
    
    # join both
    dataframe <- dataframe %>% 
      left_join(df)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-07
      • 2019-08-12
      • 2020-01-03
      • 1970-01-01
      • 2021-01-16
      • 1970-01-01
      • 2018-08-01
      • 1970-01-01
      相关资源
      最近更新 更多