要清理一些混乱的数据,我想开始使用管道%>%,但是如果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
答案 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的默认字符串函数。