R:在一个管道中组合几个 gsub() 函数
Posted
技术标签:
【中文标题】R:在一个管道中组合几个 gsub() 函数【英文标题】:R: combine several gsub() function in a pipe 【发布时间】:2017-02-21 04:15:00 【问题描述】:为了清理一些杂乱的数据,我想开始使用管道%>%
,但是如果gsub()
不在管道的开头,我无法让 R 代码正常工作,应该会晚一些(注意:这个问题是不关心正确的导入,但关心数据清理)。
简单示例:
df <- cbind.data.frame(A= c("2.187,78 ", "5.491,28 ", "7.000,32 "), B = c("A","B","C"))
A 列包含字符(在本例中为数字,但也可以是字符串)并且需要清理。 步骤是
df$D <- gsub("\\.","",df$A)
df$D <- str_trim(df$D)
df$D <- as.numeric(gsub(",", ".",df$D))
一个人可以很容易地管这个
df$D <- gsub("\\.","",df$A) %>%
str_trim() %>%
as.numeric(gsub(",", ".")) %>%
问题在于第二个 gsub,因为它要求输入 .... 这实际上是上一行的结果。
请问,谁能解释如何在管道中进一步使用像 gsub() 这样的函数? 非常感谢!
系统:R 3.2.3,Windows
【问题讨论】:
提及你正在使用的外部包。 虽然没有 gsub 你可以使用df$D <- gsub("\\.","",df$A) %>% str_trim() %>% str_replace(',', '.')
其实这可能是***.com/questions/36716710/…的副本
您实际上并不需要修剪空白以使as.numeric
工作。
外部包:dplyr,magrittr,stringr。感谢您对 str_replace(',', '.') 和 whitespace & as.numeric 的建议
【参考方案1】:
您可以使用 stringr 包中的str_replace(string, pattern, replacement)
作为gsub
的直接替代品。 stringr 函数遵循一种简洁的方法,其中字符串/字符向量是第一个参数。
c("hello", "hi") %>% str_replace_all("[aeiou]", "x")
请参阅Introduction to stringr,了解有关 stringr 合理命名和定义的函数作为 R 的默认字符串函数的替代品的更多信息。
【讨论】:
【参考方案2】:试试这个:
library(stringr)
df$D <- df$A %>%
gsub("\\.","", .) %>%
str_trim() %>%
as.numeric(gsub(",", ".", .))
使用管道,您的数据作为 first 参数传递给下一个函数,因此如果您想在其他地方使用它,您需要将下一行包装在 中并使用
.
作为数据“标记”。
【讨论】:
啊,谢谢,这是我错过的基本功能。非常感谢您解释这一点! 记住你也可以多次使用.
。
但如我的回答所示,没有必要使用.
。
@ddiez, gsub("\\.","", .)
比 gsub(pattern = "\\.", replacement="")
短得多,对我来说同样可读。
@m-dz 你是对的。但老实说,我不太喜欢你的回答或我的回答。不知何故更喜欢 G. Grothendieck 的解决方案。【参考方案3】:
通常,将管道作为一个整体应用于数据帧,就像返回已清理的数据帧一样。函数式编程的思想是对象是不可变的,不会原地改变,而是生成新的对象。
library(dplyr)
df %>%
mutate(C = gsub("\\.", "", A)) %>%
mutate(C = gsub(",", ".", C)) %>%
mutate(C = as.numeric(C))
另请注意,这些替代方法有效:
df %>% mutate(C = gsub("\\.", "", A), C = gsub(",", ".", C), C = as.numeric(C))
df %>% mutate(C = read.table(text = gsub("[.]", "", A), dec = ",")[[1]])
df %>% mutate(C = type.convert(gsub("[.]", "", A), dec = ","))
对于这个特定的例子type.convert
似乎是最合适的,因为它在高层次上紧凑地表达了我们打算做的事情。相比之下,gsub/as.numeric 解决方案似乎太低级和冗长,而 read.table 将转换添加到 data.frame 我们需要撤消它使其太高级。
【讨论】:
【参考方案4】:问题在于输入管道的参数必须是参数列表中的第一个。但gsub()
并非如此,因为x
是第三个。一个(冗长的)解决方法可能是:
df$A %>%
gsub(pattern = "\\.", replacement="") %>%
str_trim() %>%
gsub(patter = ",", replacement = ".") %>%
as.numeric
【讨论】:
以上是关于R:在一个管道中组合几个 gsub() 函数的主要内容,如果未能解决你的问题,请参考以下文章