【问题标题】:R - combining ifelse and substr [duplicate]R - 结合 ifelse 和 substr [重复]
【发布时间】:2019-04-30 06:40:42
【问题描述】:

我的样本数据是:

df <- as.data.frame(c("10M_Amts", "D2B_Exp", "D3C_Exp", "D2_Amt", "D5_Amt", "53D_Amt"))
colnames(df) <- c("Label")

我想遵守以下规则:

如果前 2 个字母是 D2、D3、D4、D5,或者前 3 个字母是 D1A 或 D1_,那么我想在名为 Work 的新列中返回单词“Work”。如果不是,则返回“NA”。

我四处搜索,但找不到 dplyr 结合 ifelse 和多个 substr 命令的示例。我尝试使用 dplyr 的代码是:

df2 <- df %>%
       mutate(Work = ifelse(substr(Label, 1, 3) == c("D1_", "D1A") |
                           substr(Label, 1, 2) == c("D2", "D3", "D4", "D5"), Work, "NA"))

如您所见,例如,对于前三个字符串,我尝试使用 c("D1_", "D1A") 来表示 D1_ 或 D1A。这对于前两个字符串 c("D2", "D3", "D4", "D5") 表示 D2 或 D3 或 D4 或 D5 是相同的。总之,如果前 2 或 3 个字母中有 D1_ 或 D1A 或 D2 或 D3 或 D4 或 D5,那么它应该在新列中返回“Work”,如果没有,则返回“NA”。但是,我使用 substr 函数拆分了这两个类别。

我的理想输出是:

     Label       Work
1   10M_Amts      NA
2   D2B_Exp      Work
3   D3C_Exp      Work
4   D2_Amt       Work
5   D5_Amt       Work
6   53D_Amt       NA

如您所见,新列名称为 Work。在excel中,我会写以下内容:

=IF(OR(LEFT(A1,3)="D1_",LEFT(A1,3)="D1A",LEFT(A1,2)={"D2","D3","D4","D5"}), 
"Work", "")

其中 A 列是上述的标签列。抱歉,样本很小,当我在 excel 中为约 5000 行和“工作”以外的多个类别执行此操作时,这很有效,但由于工作表太大,我们想转换为 R。

非常感谢您!

【问题讨论】:

  • D2A 或类似的呢?如果这可能发生,它应该是“工作”吗?
  • D2A/ 类似也会返回“工作”。是的!
  • 你必须使用%in% 而不是==

标签: r if-statement substr


【解决方案1】:

如果任何以D1, D2, ..., D5 开头的内容转换为"work",您可以使用一些简单的正则表达式来代替substr()

df %>%
  mutate(work = ifelse(grepl("^D[0-5]", Label), "Work", NA))

     Label work
1 10M_Amts <NA>
2  D2B_Exp Work
3  D3C_Exp Work
4   D2_Amt Work
5   D5_Amt Work
6  53D_Amt <NA>

【讨论】:

    【解决方案2】:

    这会起作用,你有两个问题工作应该是'工作'并使用%in%而不是==,因为你有多重比较

    df %>%
        mutate(WRE = ifelse(substr(Label, 1, 3) %in% c("D1_", "D1A")|
                            substr(Label, 1, 2) %in% c("D2", "D3", "D4", "D5"), 'Work', "NA"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-04
      • 2017-04-22
      相关资源
      最近更新 更多