【问题标题】:Conditionally replace levels of factor variable 1 for a specific variable 2有条件地替换特定变量 2 的因子变量 1 的水平
【发布时间】:2023-01-09 23:23:41
【问题描述】:

在我的例子中:

# Packages
library(dplyr)

# My dataset
FARM <- c(rep("LIBERTY2",4),rep("OLDOAK",4))
AGE <- c(8,9,10,10,8,9,10,10)
Y = c(0,0,0,0,1,1,1,1)
DS_F <- data.frame(FARM=FARM,AGE=AGE,Y=Y)
str(DS_F)
# 'data.frame': 8 obs. of  3 variables:
#  $ FARM: chr  "LIBERTY2" "LIBERTY2" "LIBERTY2" "LIBERTY2" ...
#  $ AGE : num  8 9 10 10 8 9 10 10
#  $ Y   : num  0 0 0 0 1 1 1 1

我只想在LIBERTY2变量FARM中使用条件变异并在另一个变量中使用规则:如果AGE等于10而不是3,如果AGE等于9而不是2,如果AGE 等于 8 比 1。

My final output should be:
DS_F2
#       FARM AGE Y
# 1 LIBERTY2   1 0
# 2 LIBERTY2   2 0
# 3 LIBERTY2   3 0
# 4 LIBERTY2   3 0
# 5   OLDOAK   8 1
# 6   OLDOAK   9 1
# 7   OLDOAK  10 1
# 8   OLDOAK  10 1

请帮我。

【问题讨论】:

    标签: r dplyr forcats


    【解决方案1】:

    您可以将 recode() 包围为 if_else()

    library(dplyr)
    
    DS_F %>%
      mutate(AGE.2 = if_else(FARM == "LIBERTY2",
                             recode(AGE, `10` = 3, `9` = 2, `8` = 1),
                             AGE))
    
    #       FARM AGE Y AGE.2
    # 1 LIBERTY2   8 0     1
    # 2 LIBERTY2   9 0     2
    # 3 LIBERTY2  10 0     3
    # 4 LIBERTY2  10 0     3
    # 5   OLDOAK   8 1     8
    # 6   OLDOAK   9 1     9
    # 7   OLDOAK  10 1    10
    # 8   OLDOAK  10 1    10
    

    【讨论】:

      【解决方案2】:

      这是你想要的?

      DS_F <- DS_F %>%
        mutate(FARM = as.factor(FARM),
               RULE = case_when(AGE == 10 ~ 3, 
                                AGE == 9 ~ 2,
                                AGE == 8 ~ 1))
      

      产生

      > DS_F %>%
      +   mutate(FARM = as.factor(FARM),
      +          RULE = case_when(AGE == 10 ~ 3, 
      +                           AGE == 9 ~ 2,
      +                           AGE == 8 ~ 1))
            FARM AGE Y RULE
      1 LIBERTY2   8 0    1
      2 LIBERTY2   9 0    2
      3 LIBERTY2  10 0    3
      4 LIBERTY2  10 0    3
      5   OLDOAK   8 1    1
      6   OLDOAK   9 1    2
      7   OLDOAK  10 1    3
      8   OLDOAK  10 1    3
      

      具有以下数据类型

      > str(DS_F)
      'data.frame':   8 obs. of  4 variables:
       $ FARM: Factor w/ 2 levels "LIBERTY2","OLDOAK": 1 1 1 1 2 2 2 2
       $ AGE : num  8 9 10 10 8 9 10 10
       $ Y   : num  0 0 0 0 1 1 1 1
       $ RULE: num  1 2 3 3 1 2 3 3
      

      【讨论】:

      • 预期输出为 1,2,3,3,8,9,10,10
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-08
      • 2021-03-13
      • 2017-05-23
      • 2016-12-05
      • 1970-01-01
      相关资源
      最近更新 更多