【问题标题】:Defining element based on condition in R根据 R 中的条件定义元素
【发布时间】:2021-10-31 12:31:53
【问题描述】:

假设我有一个如下所示的数据框 (df):

stim <- c("a", "k", "y", "j", "t", "Stop", "f", "l", "b", "a", "c", "Stop")
df <- data.frame(stim)

我想根据“stim”的值创建另一列“YesorNo”。我想要的输出是这样的:

stim  YesorNo
 a      yes
 k      yes
 y      yes
 j      yes
 t       No
 Stop   N/A
 f      yes
 l      yes
 b      yes
 a      yes
 c       No
 Stop   N/A
 ...    ...

如果 stim 为“停止”,我希望“YesorNo”的值为 N/A。我可以为此使用一个简单的 ifelse 语句 (df$YesorNo &lt;- ifelse(df$stim=="Stop", "N/A", "yes") 但我也希望“停止”之前的值(在我的示例中为字母 t 和 c)对应于“否”而不是“是”。我该如何定义?

【问题讨论】:

    标签: r if-statement indexing


    【解决方案1】:

    这是使用case_when + 运算符%in%tidyverse 解决方案

    代码

    library(tidyverse)
        
    df %>% 
      mutate(
        YesorNo = case_when(
          stim == "Stop" ~ NA_character_,
          stim %in% c("t","c") ~ "no",
          #other conditions
          TRUE ~ "yes"
        )
      )
    

    结果

       stim YesorNo
    1     a     yes
    2     k     yes
    3     y     yes
    4     j     yes
    5     t      no
    6  Stop    <NA>
    7     f     yes
    8     l     yes
    9     b     yes
    10    a     yes
    11    c      no
    12 Stop    <NA>
    

    【讨论】:

    • 感谢分享!不幸的是,我认为我不能使用它,因为“Stop”之前的字母是完全随机的(t 和 c 只是示例,我有 40,000 多行)。所以我需要调用 [Stop-1] 案例而不是使用 %in%。不过,我很感谢您的回复!
    【解决方案2】:

    抱歉,我不知道如何调用 dplyr 中的下一个或过去的值

    df<- df%>%
      mutate(YesorNo = ifelse(stim == "Stop", "N/A", "yes"))
    for (i in 1:dim(df)[1]){
      if (df$YesorNo[i] == "N/A") {
        if(i == 1){
        } else {
          df$YesorNo[i-1] = "no"
        }
      }
    }
    
       stim YesorNo
    1     a     yes
    2     k     yes
    3     y     yes
    4     j     yes
    5     t      no
    6  Stop     N/A
    7     f     yes
    8     l     yes
    9     b     yes
    10    a     yes
    11    c      no
    12 Stop     N/A
    

    【讨论】:

      【解决方案3】:

      您可以使用lead 查找下一个值,使用case_when 列出条件。

      library(dplyr)
      
      df %>%
        mutate(YesorNo = case_when(stim == 'Stop' ~ NA_character_, 
                                   lead(stim) == 'Stop' ~ "No", 
                                   TRUE ~ 'Yes'))
      
      #   stim YesorNo
      #1     a     Yes
      #2     k     Yes
      #3     y     Yes
      #4     j     Yes
      #5     t      No
      #6  Stop    <NA>
      #7     f     Yes
      #8     l     Yes
      #9     b     Yes
      #10    a     Yes
      #11    c      No
      #12 Stop    <NA>
      

      同样在data.table 中你可以使用fcase

      setDT(df)[, YesorNo := fcase(stim == 'Stop', NA_character_, 
                                   shift(stim, type = 'lead') == 'Stop', "No", 
                                   default = "Yes")]
      df
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-05-04
        • 1970-01-01
        • 2020-06-06
        • 1970-01-01
        • 2015-05-06
        • 1970-01-01
        • 2011-03-30
        相关资源
        最近更新 更多