R-结合ifelse和substr

时间:2018-11-28 11:08:33

标签: r if-statement substr

我的样本数据是:

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”。

我已经搜索了一下,但是找不到一个结合了ifelse和多个substr命令的dplyr的示例。我尝试使用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的前三个字符串存在多个OR。对于表示D2或D3或D4或D5的前两个字符串c(“ D2”,“ D3”,“ D4”,“ D5”)相同。总之,如果前2个或3个字母中包含D1_或D1A或D2或D3或D4或D5,则它应在新列中返回“工作”,否则应返回“ 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列是上面的Label列。抱歉,对于小样本,当我在excel中针对约5000行和“工作”以外的多个类别进行此操作时,此方法有效,但由于工作表太大,我们希望转换为R。

非常感谢您!

2 个答案:

答案 0 :(得分: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"))

答案 1 :(得分:2)

如果以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>