R - 组合 ifelse 和 substr
R - combining ifelse and 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_,那么我想 return 新列中的单词 "Work"称为工作。如果没有,则 return "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 的前三个字符串,存在多个 OR。前两个字符串c("D2", "D3", "D4", "D5")表示D2或D3或D4或D5也是一样的。总之,如果前 2 或 3 个字母中有 D1_ 或 D1A 或 D2 或 D3 或 D4 或 D5,则它应该在新列中 return "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 行和 "Work" 以外的多个类别执行此操作时,这很有效,但是因为 sheet 太大了,我们想要转换为 R.
在此先感谢您!
这会起作用,你有两个问题 工作应该是 'Work' 并使用 %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"))
如果以 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>
我的示例数据是:
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_,那么我想 return 新列中的单词 "Work"称为工作。如果没有,则 return "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 的前三个字符串,存在多个 OR。前两个字符串c("D2", "D3", "D4", "D5")表示D2或D3或D4或D5也是一样的。总之,如果前 2 或 3 个字母中有 D1_ 或 D1A 或 D2 或 D3 或 D4 或 D5,则它应该在新列中 return "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 行和 "Work" 以外的多个类别执行此操作时,这很有效,但是因为 sheet 太大了,我们想要转换为 R.
在此先感谢您!
这会起作用,你有两个问题 工作应该是 'Work' 并使用 %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"))
如果以 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>