Парсер данных в df с использованием R - PullRequest
0 голосов
/ 09 мая 2020

У меня 1 столбец input.csv, я хочу преобразовать в три столбца на основе некоторого logi c кал.

Я сделал output.csv по формуле Excel, может работать, но теперь я хочу работать в R ...

Пока что в R я думал назначить некоторую категорию в столбце 2, как draft.R ниже.

Как я могу это улучшить? См. ссылку на Google Excel для подробностей.

Я также приложил фигуру и выделил цвет в таблице, чтобы показать лог c.

enter image description here

#draft.R
in1 = read.csv("input.csv")
df2 <- in1
df2$V2 <- ifelse(
grepl("LAYER",df2$V1),1,
ifelse(grepl("DATATYPE",df2$V1),2,0
)
)
df2 <- as.data.frame(df2)
df2

#input.csv
V1
LAYER: 34 ;
DATATYPE: 0 ;
0;0
10;0
10;0.9
0;0.9
0;0
LAYER: 34 ;
DATATYPE: 0 ;
0;9.1
10;9.1
10;10
0;10
0;9.1
LAYER: 44 ;
DATATYPE: 10 ;
9.52;1.3
9.8;1.3
9.8;9.1
9.52;9.1
9.52;1.3

#I expect output.csv    
V1  group   L;D
0;0 1   34;0
10;0    1   34;0
10;0.9  1   34;0
0;0.9   1   34;0
0;0 1   34;0
0;9.1   2   34;0
10;9.1  2   34;0
10;10   2   34;0
0;10    2   34;0
0;9.1   2   34;0
9.52;1.3    3   44;10
9.8;1.3 3   44;10
9.8;9.1 3   44;10
9.52;9.1    3   44;10
9.52;1.3    3   44;10

1 Ответ

0 голосов
/ 09 мая 2020

Достигнут желаемый результат с использованием пользовательской функции и dplyr

library(dplyr)

FillValuesFromRowsAbove <- function(x, Pattern = is.na) {
  # this function fills values from cell above to the cells present in pattern
  # args: 
  # x : vector
  # pattern : pattern where values to be filled
  if (is.function(Pattern)) {
    isnotPattern <- !Pattern(x)
  } else {
    isnotPattern <- x != Pattern
  }
  # Fill down
  x[which(isnotPattern)][cumsum(isnotPattern)]
} 

#created intermediate variables ID & ID1 to get the correct grouping  
df<-  df %>%
  group_by(ID = with(rle(grepl("LAYER",var1) == TRUE|grepl("DATATYPE",var1) == TRUE ),
                        rep(seq_along(lengths), lengths))) %>%
  mutate(Id1=ifelse(ID%%2!=0,paste0(var1,collapse = "|"),""),
         Id1=gsub("[^0-9;]+", "", Id1) # selecting only numeric with ;
         ) %>% ungroup() 

df$Id1<- FillValuesFromRowsAbove(df$Id1,Pattern = "")
df$group<- df %>% group_indices(df$Id1) # creating group number

df<- df %>% 
  filter(ID%%2==0) %>% 
  select(-ID)   %>%  
  rename("L.D"="Id1")

output

 df
# A tibble: 15 x 3
   var1     L.D    group
   <chr>    <chr>  <int>
 1 0;0      34;0;      1
 2 10;0     34;0;      1
 3 10;0.9   34;0;      1
 4 0;0.9    34;0;      1
 5 0;0      34;0;      1
 6 0;9.1    34;0;      1
 7 10;9.1   34;0;      1
 8 10;10    34;0;      1
 9 0;10     34;0;      1
10 0;9.1    34;0;      1
11 9.52;1.3 44;10;     2
12 9.8;1.3  44;10;     2
13 9.8;9.1  44;10;     2
14 9.52;9.1 44;10;     2
15 9.52;1.3 44;10;     2
...