将信息从两列R、tidyverse中拆分

将信息从两列R、tidyverse中拆分,r,tidyverse,R,Tidyverse,我有两列数据: # A tibble: 16 x 2 code niveau <chr> <dbl> 1 A 1 2 1 2 3 2 2 4 3 2 5 4 2 6 5 2 7 B 1 8 6 2 9 7 2 #一个tible:16 x 2 代码niveau 1 A 1 2 1

我有两列数据:

# A tibble: 16 x 2
   code  niveau
   <chr>  <dbl>
 1 A          1
 2 1          2
 3 2          2
 4 3          2
 5 4          2
 6 5          2
 7 B          1
 8 6          2
 9 7          2
#一个tible:16 x 2
代码niveau
1 A 1
2 1          2
3 2          2
4 3          2
5 4          2
6 5          2
7 B 1
8 6          2
9 7          2
我期望的输出是:

 A tibble: 16 x 3
   code  niveau cat  
   <chr>  <dbl> <chr>
 1 A          1 A    
 2 1          2 A    
 3 2          2 A    
 4 3          2 A    
 5 4          2 A    
 6 5          2 A    
 7 B          1 B    
 8 6          2 B  
A tibble:16 x 3
代码niveau猫
1 A 1 A
2 1 2 A
3 2 A
4 3 2 A
5 4 2 A
6 5 2 A
7b 1b
8 6 2 B
我想知道有没有一种简洁的方法来转换这些数据而不必循环

以下是一些虚拟数据:

data<-tibble(code=c('A', 1,2,3,4,5,'B', 6,7,8,9,'C',10,11,12,13), niveau=c(1, 2,2,2,2,2,1,2,2,2,2,1,2,2,2,2))

desired_output<-tibble(code=c('A', 1,2,3,4,5,'B', 6,7,8,9,'C',10,11,12,13), niveau=c(1, 2,2,2,2,2,1,2,2,2,2,1,2,2,2,2), 
                       cat=c(rep('A', 6),rep('B', 5), rep('C', 5)))

data可能,您可以创建一个新列
cat
,并在有数字的地方将
code
值替换为
NA
。然后,我们可以使用
fill
将缺少的值替换为以前的非NA值

library(dplyr)
data %>% mutate(cat = replace(code, grepl('\\d', code), NA)) %>% tidyr::fill(cat)

# A tibble: 16 x 3
#   code  niveau cat  
#   <chr>  <dbl> <chr>
# 1 A          1 A    
# 2 1          2 A    
# 3 2          2 A    
# 4 3          2 A    
# 5 4          2 A    
# 6 5          2 A    
# 7 B          1 B    
# 8 6          2 B    
# 9 7          2 B    
#10 8          2 B    
#11 9          2 B    
#12 C          1 C    
#13 10         2 C    
#14 11         2 C    
#15 12         2 C    
#16 13         2 C  
库(dplyr)
数据%>%突变(cat=replace(代码,grepl('\\d',code),NA))%>%tidyr::fill(cat)
#一个tibble:16 x 3
#代码niveau猫
#      
#1 A 1 A
#2 1 2 A
#3 2 A
#4 3 2 A
#5 4 2 A
#6 5 2 A
#7b 1b
#8 6 2 B
#9 7 2 B
#10 8 2 B
#11 9 2 B
#12 C 1 C
#13 10 2 C
#14 11 2 C
#15 12 2 C
#16 13 2 C

我们可以从
stringr

library(dplyr)
library(stringr)
library(tidyr)
data %>%
     mutate(cat = replace(code, str_detect(code, '\\d'), NA)) %>% 
     fill(cat)

嗨,Ronak,这非常有效,节省了很多时间-我不知道填充功能。非常感谢:-)