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 &lt;- gsub("\\.","",df$A) %&gt;% str_trim() %&gt;% 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() 函数的主要内容,如果未能解决你的问题,请参考以下文章

如何在 R 中使用 gsub 从字符串中删除非数字字符?

R 中的 gsub() 没有替换 '.' (点)

在 R 中的一个 gsub() 或 chartr() 语句中替换多个字符串?

R语言的自定义函数—字符组合

如何在多参数函数上应用函数组合或管道?

我可以使用 gsub 函数找到一个模式并用 2 个不同的模式替换它吗?