【问题标题】:Replace values in r using case_when使用 case_when 替换 r 中的值
【发布时间】:2021-08-13 21:29:56
【问题描述】:

我正在尝试在 r 中复制一些 Stata 代码。在我的 df 中,有一个变量“时间”和一个“曝光”(均为数字,因此具有 1、2、3 等值。

这是原始Stata代码的样子:

replace time = (time - 31) if exposure == 0

这是我尝试过的:

recoded_df <- recoded_df %>% mutate(time = case_when(exposure == 0 ~ (time - 31))

我收到错误消息,即代码中存在“意外符号”。但我不知道我做错了什么。

【问题讨论】:

  • 您能否通过dput(head(data)) 分享一段可重现的数据?如果您有任何机会获得相关解决方案,这一点至关重要。
  • 如果没有要测试的样本数据,您的代码看起来是正确的,只是最后缺少)。您可能还想设置“无更改”的默认值,mutate(time = case_when(exposure == 0 ~ (time - 31), TRUE ~ time))
  • 除了示例数据,我不知道如何从此代码中获取该错误:没有最后一个右括号,R 只是等待我关闭表达式,没有错误。我的猜测是你还有其他东西,可能是mutate(time = case_when(...) time2 = foo(.)),其中需要一个逗号(不过只是猜测)。
  • @GregorThomas,我也倾向于更喜欢这种方法,明确添加默认值,但case_when 确实默认为NA,这可能是 OP 的意图。 (idk)
  • 而@r2evans 我的假设是共享的Stata代码不会使未转换的值不适用。

标签: r dplyr case-when


【解决方案1】:
library(dplyr)

df <- data.frame(
  exposure = c(0, 1),
  time = c(81, 20)
)

df %>%
  mutate(
    time = case_when(exposure == 0 ~ time - 30,
                     TRUE ~ time)
  )

  exposure time
1        0   51
2        1   20

【讨论】:

    【解决方案2】:

    使用data.tablefifelse

    library(data.table)
    setDT(df)[, time := fifelse(!exposure, time - 30,  time)]
    

    【讨论】:

      【解决方案3】:

      您可以通过以下两种可能性使用假数据框完成任务:

      # fake dataframe:
      df <- tribble(
        ~time, ~exposure,
        100, 0,
       70, 1, 
        90, 0, 
        60, 1, 
        50, 0
      )
      
      # 1. with mutate and ifelse
      library(dplyr)
      df %>% 
        mutate(time = ifelse(exposure == 0, time-31, time))
      
      # 2. with base R and ifelse
      df$time <- ifelse(df$exposure == 0, df$time - 31, df$time) 
      

      【讨论】:

        【解决方案4】:

        如果我理解正确,来自 base R 的ifelse 应该涵盖这个:

        recoded_df$time = ifelse(recoded_df$exposure == 0,
                                 recoded_df$time - 31, recoded_df$time)
        

        【讨论】:

          猜你喜欢
          • 2021-08-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-25
          • 2018-10-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多