我的样本数据是:
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。
非常感谢您!
答案 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>