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

问题描述 投票:8回答:4

要清除一些凌乱的数据,我想开始使用管道%>%,但是如果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

r pipeline gsub
4个回答
17
投票

尝试一下:

library(stringr)

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

使用管道将您的数据作为first参数传递给下一个函数,因此,如果要在其他地方使用它,则需要将下一行包装在{}中,并使用.作为数据“标记”。


8
投票

通常,像这样将管道整体应用于数据帧,以返回清理后的数据帧。函数式编程的思想是对象是不可变的,不会在原位置更改,而是会生成新的对象。

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添加了转换,我们需要撤消使其级别太高。


3
投票

问题在于,输入到管道中的参数必须是参数列表中的第一个参数。但是gsub()并非如此,因为x是第三个。 (冗长的)解决方法可能是:

df$A %>% 
  gsub(pattern = "\\.", replacement="") %>%
  str_trim() %>%
  gsub(patter = ",", replacement = ".") %>%
  as.numeric

1
投票

您可以使用软件包stringr中的str_replace(string, pattern, replacement)替代str_replace(string, pattern, replacement)。字符串函数遵循整洁的方法,其中字符串/字符向量是第一个参数。

gsub

请参阅c("hello", "hi") %>% str_replace_all("[aeiou]", "x") ,以获取有关Stringer合理命名和定义的函数的替代信息,以代替R的默认字符串函数。

© www.soinside.com 2019 - 2024. All rights reserved.