使用 R 的 df 数据解析器

Data parser to df using R

我有 1 个列 input.csv,我想根据一些逻辑计算转换为三个列。

我已经通过 Excel 公式完成了 output.csv,可以工作,但现在我想 运行 在 R...

到目前为止,在 R 中,我的想法是在第 2 列中分配一些类别,如下 draft.R。

我该如何改进它?有关详细信息,请参阅 Google Excel link

我在table中还附上了无花果和高亮颜色来显示逻辑。

#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

使用用户定义的函数实现了预期的输出并且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