要清除一些凌乱的数据,我想开始使用管道%>%
,但是如果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
尝试一下:
library(stringr)
df$D <- df$A %>%
{ gsub("\\.","", .) } %>%
str_trim() %>%
{ as.numeric(gsub(",", ".", .)) }
使用管道将您的数据作为first参数传递给下一个函数,因此,如果要在其他地方使用它,则需要将下一行包装在{}
中,并使用.
作为数据“标记”。
通常,像这样将管道整体应用于数据帧,以返回清理后的数据帧。函数式编程的思想是对象是不可变的,不会在原位置更改,而是会生成新的对象。
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添加了转换,我们需要撤消使其级别太高。
问题在于,输入到管道中的参数必须是参数列表中的第一个参数。但是gsub()
并非如此,因为x
是第三个。 (冗长的)解决方法可能是:
df$A %>%
gsub(pattern = "\\.", replacement="") %>%
str_trim() %>%
gsub(patter = ",", replacement = ".") %>%
as.numeric
您可以使用软件包stringr中的str_replace(string, pattern, replacement)
替代str_replace(string, pattern, replacement)
。字符串函数遵循整洁的方法,其中字符串/字符向量是第一个参数。
gsub
请参阅c("hello", "hi") %>% str_replace_all("[aeiou]", "x")
,以获取有关Stringer合理命名和定义的函数的替代信息,以代替R的默认字符串函数。