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

时间:2016-10-12 11:19:32

标签: r pipeline gsub

要清理一些混乱的数据,我想开始使用管道%>%,但是如果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()这样的函数吗? 非常感谢!

system:R 3.2.3,Windows

4 个答案:

答案 0 :(得分:14)

试试这个:

library(stringr)

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

使用管道,您的数据将作为第一个参数传递给下一个函数,因此如果您想在其他地方使用它,则需要在{}中包含下一行并使用{ {1}}作为数据&#34;标记&#34;。

答案 1 :(得分: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,我们需要将其转换为过高的级别。

答案 2 :(得分:2)

问题是输入管道的参数需要是参数列表中的第一个参数。但Delete repository并非如此,因为gsub()是第三个。{1}}。 (罗嗦)解决方法可能是:

x

答案 3 :(得分:1)

您可以使用软件包 stringr 中的str_replace(string, pattern, replacement)来代替minimal.cpp:82:21: error: no viable overloaded '>>=' auto res5a = res4 >>= triple; ~~~~ ^ ~~~~~~ minimal.cpp:26:17: note: candidate template ignored: could not match 'function<result<type-parameter-0-0, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > (int)>' against 'result<int, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > (*)(int)' result<T,F> operator>>=(std::function<result<T,F>(S)> func) { ^ minimal.cpp:83:32: error: invalid operands to binary expression ('result<int, std::string> (int)' and 'result<int, std::string> (*)(int)') auto res5b = res4 >>= triple >>= triple; 。字符串函数遵循一种整洁的方法,其中字符串/字符向量是第一个参数。

gsub

有关{<3}}的详细信息,请参阅stringr的合理命名和定义的函数,以代替R的默认字符串函数。