Разделить информацию из двух столбцов, R, Tidyverse - PullRequest
0 голосов
/ 27 апреля 2020

у меня есть некоторые данные в двух столбцах:

# 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

Мой желаемый вывод:

 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  

Есть ли надежный способ конвертировать эти данные, не проходя через них?

Вот некоторые фиктивные данные:

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)))

Николас

Ответы [ 2 ]

1 голос
/ 27 апреля 2020

Возможно, вы можете создать новый столбец cat и replace 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  
0 голосов
/ 27 апреля 2020

Мы можем использовать str_detect от stringr

library(dplyr)
library(stringr)
library(tidyr)
data %>%
     mutate(cat = replace(code, str_detect(code, '\\d'), NA)) %>% 
     fill(cat)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...