使用 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
我有 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