函数,库(tidyverse)

函数,库(tidyverse),r,dataframe,split,tidyverse,R,Dataframe,Split,Tidyverse,我一直在使用库(tidyverse)中的函数separate()将值分隔为不同的列: 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.

我一直在使用库(tidyverse)中的函数separate()将值分隔为不同的列:

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>
由于您没有覆盖默认的
sep
,因此它会查找任何不是字母或数字的内容。仅供参考,
[^[:alnum:]+
类似于
[^A-Za-z0-9]+
,它匹配“不在A-Z、A-Z或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>
sep=“[^[:alnum:][%]+”,extra=“drop”)
#警告:1个位置的值太少:2
##A tible:2×3
#x y z
# *   
# 1   45%    10    89
# 2   34%    
编辑:使用最新的样本数据:

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
sep(数据帧(a=c(“45%(10/89)”,“34%,”,“67%,“78%(89/98)”),a,c('x','y','z'),sep=“[^[:alnum:]%+”,extra=“drop”)
#警告:3个位置的值太少:2、3、4
##A tible:5×3
#x y z
# *   
# 1   45%    10    89
# 2   34%    
# 3          
# 4   67%    
# 5   78%    89    98

它对我有效。“不起作用”对你来说到底意味着什么?我没有得到45 10 89,而是得到了7 7 6,我认为这是一个考虑因素,数字与这些因素相对应。Mee,输出
7 7 6
毫无意义,即使考虑到
stringsafactors=TRUE
(这不会改变它)。如果我下面的回答不符合您的需要,我认为您需要在问题中添加
dput(head(dd))
(或包含您刚才描述的行为的特定行)的输出,从而使这个问题更进一步。是的,我知道输出7 6没有意义。我认为是因为变量中某些行中的数据根本没有数据,例如:“75%(10/11)”,“45%”
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