R:在管道中组合几个gsub()函数

use*_*697 8 pipeline r gsub

为了清理一些凌乱的数据,我想开始使用管道%>%,但是如果gsub()不在管道的开头,我就不能使R代码工作,应该发生得晚(注意:这个问题不关心适当导入,但数据清理)

简单的例子:

df <- cbind.data.frame(A= c("2.187,78 ", "5.491,28 ", "7.000,32 "), B = c("A","B","C"))
Run Code Online (Sandbox Code Playgroud)

A列包含字符(在本例中为数字,但也可以是字符串),需要清除.步骤是

df$D <- gsub("\\.","",df$A)
df$D <- str_trim(df$D) 
df$D <- as.numeric(gsub(",", ".",df$D))
Run Code Online (Sandbox Code Playgroud)

一个人可以轻易地解决这个

df$D  <-  gsub("\\.","",df$A) %>%
          str_trim() %>%
          as.numeric(gsub(",", ".")) %>%
Run Code Online (Sandbox Code Playgroud)

问题是第二个gsub,因为它要求输入....实际上是前一行的结果.

请问,任何人都可以解释如何在管道中进一步使用像gsub()这样的函数吗?非常感谢!

系统:R 3.2.3,Windows

m-d*_*-dz 17

试试这个:

library(stringr)

df$D <- df$A %>%
  { gsub("\\.","", .) } %>%
  str_trim() %>%
  { as.numeric(gsub(",", ".", .)) }
Run Code Online (Sandbox Code Playgroud)

使用管道,您的数据将作为第一个参数传递给下一个函数,因此如果您想在其他地方使用它,则需要将下一行包装起来{}.用作数据"标记".


G. *_*eck 8

通常,将管道作为整体应用于数据框,就像返回已清理的数据框一样.函数式编程的想法是对象是不可变的并且不会在适当的位置进行更改,而是生成新的对象.

library(dplyr)

df %>%
   mutate(C = gsub("\\.", "", A)) %>%
   mutate(C = gsub(",", ".", C)) %>%
   mutate(C = as.numeric(C))
Run Code Online (Sandbox Code Playgroud)

另请注意,这些替代方案有效:

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 = ","))
Run Code Online (Sandbox Code Playgroud)

对于这个特定的例子type.convert似乎是最合适的,因为它紧凑地表达了我们打算做的高级别.相比之下,gsub/as.numeric解决方案看起来过于低级且冗长,而read.table则将转换添加到data.frame,我们需要将其转换为过高的级别.