【问题标题】:R: Update Column Based on Text Condition from Another ColumnR:根据另一列的文本条件更新列
【发布时间】:2019-10-25 04:07:29
【问题描述】:

我想在我的数据框中创建一个新列,方法是使用条件语句“如果 Column_y 包含 Column_x 则 1 else 0”

例如:

Event   Name     Winner       Loser          New Column
1       James    James,Bob    John,Steve     1
1       Bob      James,Bob    John,Steve     1
1       John     James,Bob    John,Steve     0
1       Steve    James,Bob    John,Steve     0

我想要新列

请记住,这适用于 100,000 行,可能有 700 个唯一名称。当我尝试像

df$NewColumn<-ifelse(grepl(df$Name,df$Winner)==TRUE,1,0) 

或变体我得到“模式的长度 > 1”错误。

【问题讨论】:

    标签: r if-statement conditional-statements


    【解决方案1】:

    我认为您只想将Name 列与Winner 列进行比较:

    df$NewColumn <- ifelse(df$Name == df$Winner, 1, 0)
    

    请注意,因为df$Name == df$Winner 实际上是一个布尔表达式,您也可以简化为:

    df$NewColumn <- df$Name == df$Winner
    

    【讨论】:

    • 抱歉,我在示例中发现了一个错误,因为您的回答准确地告诉了我,如果“赢家”和“输家”列只有名称,就是这样,我需要什么。我没有提到还有另一个组件,并且“赢家”和“输家”列有多个名称。我将这样编辑问题,但将其视为多人竞赛,数据来自获胜者或失败者列中的多个名称,但我想为每个名称分配 1 或 0。
    【解决方案2】:

    在您的示例中,精确的字符串匹配有效。但我假设它不适用于您的整个数据。

    实现包含条件是这样的:

    
    library(dplyr)
    library(purrr)
    
    df = df %>% 
      dplyr::mutate(NewColumn = purrr::map2_dbl(.x=Winner,.y=Name,~ifelse(grepl(.y,.x),1,0)))
    
    

    使用stringr 添加替代解决方案:

    df = df %>% 
      dplyr::mutate(NewColumn=ifelse(str_detect(Winner,Name),1,0))
    

    让我知道这是否有效。

    P.S.:str_detect 更快。

    【讨论】:

    • 非常感谢临时,这绝对有效!我不知道这意味着什么,但它给了我想要的结果!
    • 我意识到 purrr 语法需要一点时间来适应。此外,您也可以使用来自stringr 包的str_detect。语法为:df %&gt;% dplyr::mutate(NewColumn=ifelse(str_detect(Winner,Name),1,0))。请注意与 grepl 相比参数位置的变化。
    • 像魅力一样工作。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多