Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Manipulate/rearrange intervals in R columns

Tags:

dataframe

r

I have a data frame in R with a column (sni) with numbers that looks like this etc

bransch sni
name 15
name 15
name 16-18
somename 16-18
name 241-3
someothername 241-3

where I have to transform/create a new column with just one number per row, i.e. no intervals so for example it should be a new row for all individual values in the intervals and look like this

bransch sni
name 15
name 15
name 16
name 17
name 18
somename 16
somename 17
somename 18
name 241
name 242
name 243
someothername 241
someothername 242
someothername 243

I'm a bit unsure which function can do this the best way, or if someone has stumble upon a similar problem/solution. Currently I have tried to split the sni column (where the "-" starts) into two new ones, but then I'm a bit stuck since I will have many rows in one of the new columns without any values etc. Also the column is a character at the moment.

Any advice? Sincerely, TS

like image 681
TerribleStudent Avatar asked Nov 01 '25 18:11

TerribleStudent


1 Answers

I took a while. Here is tidyverse approach:

library(dplyr)
library(tidyr)

df %>% 
  separate(sni, c("x", "y")) %>% 
  as_tibble() %>% 
  mutate(y = ifelse(as.numeric(y)<=9, paste0(substr(x, 1, nchar(x)-1), y),
                                 y)) %>% 
  mutate(id = row_number()) %>% 
  pivot_longer(c(x,y)) %>% 
  mutate(value = as.numeric(value)) %>% 
  group_by(col2 =as.integer(gl(n(),2,n()))) %>% 
  fill(value, .direction = "down") %>% 
  complete(value = seq(first(value), last(value), by=1)) %>% 
  fill(bransch, .direction = "down") %>% 
  select(bransch, sni=value) %>% 
  group_by(col2, sni) %>% 
  slice(1)

   col2 bransch         sni
   <int> <chr>         <dbl>
 1     1 name             15
 2     2 name             15
 3     3 name             16
 4     3 name             17
 5     3 name             18
 6     4 somename         16
 7     4 somename         17
 8     4 somename         18
 9     5 name            241
10     5 name            242
11     5 name            243
12     6 someothername   241
13     6 someothername   242
14     6 someothername   243
like image 179
TarJae Avatar answered Nov 03 '25 07:11

TarJae