gpt4 book ai didi

r - mutate() 中的 Dplyr 管道 (%>%)?

转载 作者:行者123 更新时间:2023-12-02 05:23:50 25 4
gpt4 key购买 nike

dplyr 中的管道很酷,有时我想通过对其应用多个命令来清理一列。有没有办法在 mutate() 命令中使用管道?我在使用正则表达式时最注意到这一点,并且在其他情况下也会出现这种情况。在下面的示例中,我可以清楚地看到我对“Clean”列应用的不同操作,我很好奇是否有办法在 %>% 中模拟 mutate()

library(dplyr)
phone <- data.frame(Numbers = c("1234567890", "555-3456789", "222-222-2222",
"5131831249", "123.321.1234","(333)444-5555",
"+1 123-223-3234", "555-666-7777 x100"),
stringsAsFactors = F)

phone2 <- phone %>%
mutate(Clean = gsub("[A-Za-z].*", "", Numbers), #remove extensions
Clean = gsub("[^0-9]", "", Clean), #remove parentheses, dashes, etc
Clean = substr(Clean, nchar(Clean)-9, nchar(Clean)), #grab the right 10 characters
Clean = gsub("(^\\d{3})(\\d{3})(\\d{4}$)", "(\\1)\\2-\\3", Clean)) #format

phone2

我知道可能有更好的 gsub() 命令,但就这个问题而言,我想知道是否有办法将这些 gsub() 元素通过管道连接在一起,这样我就不必继续编写 Clean = gsub(...) 但也不必使用我将这些相互嵌入的方法。

如果你用一个更简单的例子来回答这个问题,我会觉得很好。

最佳答案

不要落入无尽管道的陷阱。为可读性和效率做正确的事情,写一个函数。

phone %>% mutate(Clean = cleanPhone(Numbers))
# Numbers Clean
# 1 1234567890 (123)456-7890
# 2 555-3456789 (555)345-6789
# 3 222-222-2222 (222)222-2222
# 4 5131831249 (513)183-1249
# 5 123.321.1234 (123)321-1234
# 6 (333)444-5555 (333)444-5555
# 7 +1 123-223-3234 (123)223-3234
# 8 555-666-7777 x100 (666)777-7100

自定义功能:
cleanPhone <- function(x) {
x2 <- gsub("[^0-9]", "", x)
x3 <- substr(x2, nchar(x2)-9, nchar(x2))
gsub("(^\\d{3})(\\d{3})(\\d{4}$)", "(\\1)\\2-\\3", x3)
}

关于r - mutate() 中的 Dplyr 管道 (%>%)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39295000/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com