繁体   English   中英

split()函数,库(tidyverse)

[英]separate() function, library(tidyverse)

我一直在使用来自library(tidyverse)的功能split()将值分成不同的列:

45 (10, 89) 
34

和代码:

dd %>% separate(a, c("x","y","z"), extra="drop") 

我得到了想要的东西:

45 10 89
34

但是现在,我的变量具有不同的格式,无法正常工作:

45% (10,89)
34%

为什么使用符号“%”时不起作用?

******编辑:好的,我知道为什么不起作用,这是因为数据中的小数点符号:

4.5% (10/89)
3.4%

6.7%

7.8% (89/98)

如何使用单独的函数处理小数? 非常感谢你!!


谢谢!

我推断当您说“不起作用”时,是因为百分号已被删除:

separate(data_frame(a=c("45 (10, 89)","34")), a, c('x','y','z'), extra="drop")
# Warning: Too few values at 1 locations: 2
# # A tibble: 2 × 3
#       x     y     z
# * <chr> <chr> <chr>
# 1    45    10    89
# 2    34  <NA>  <NA>
separate(data_frame(a=c("45% (10, 89)","34%")), a, c('x','y','z'), extra="drop")
# Warning: Too few values at 1 locations: 2
# # A tibble: 2 × 3
#       x     y     z
# * <chr> <chr> <chr>
# 1    45    10    89
# 2    34        <NA>

?separate

 separate(data, col, into, sep = "[^[:alnum:]]+", remove = TRUE, convert = FALSE, extra = "warn", fill = "warn", ...) ... 

由于您没有覆盖sep的默认值,因此它将查找不是字母或数字的任何内容。 FYI, [^[:alnum:]]+[^A-Za-z0-9]+类似,它匹配“ 1个或多个不在AZ,az或0-9字符范围内的字符”。

只需提供更详细的sep ,您就会得到想要的东西。

separate(data_frame(a=c("45% (10, 89)","34%")), a, c('x','y','z'), sep="[^[:alnum:]%]+", extra="drop")
# Warning: Too few values at 1 locations: 2
# # A tibble: 2 × 3
#       x     y     z
# * <chr> <chr> <chr>
# 1   45%    10    89
# 2   34%  <NA>  <NA>

编辑 :使用最新的样本数据:

separate(data_frame(a=c("45% (10/89)","34%","","67%","78% (89/98)")), a, c('x','y','z'), sep="[^[:alnum:]%]+", extra="drop")
# Warning: Too few values at 3 locations: 2, 3, 4
# # A tibble: 5 × 3
#       x     y     z
# * <chr> <chr> <chr>
# 1   45%    10    89
# 2   34%  <NA>  <NA>
# 3        <NA>  <NA>
# 4   67%  <NA>  <NA>
# 5   78%    89    98

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM