Не уверен, что результат именно то, что вам нужно, но, возможно, это может помочь.Я думаю также, может быть, это не самое эффективное и красивое решение, но оно может стать отправной точкой.
Однако я назвал dats
ваши данные:
head(dats)
df
1 2:02:02
2 2:-1:-1
3 -1:2:-1
4 2:-1:-1
5 1(1)|1(2):2:2
6 1(1)|1(2):2:2
И я создалотображение data.frame
:
mapping
id value
1 2 Homo
2 -1 No
3 1 Het
4 1(1) Het1
5 1(2) Het2
Сначала я разделил на stringr::str_split_fixed()
двойные точки:
library(stringr)
double_point <- as.data.frame.matrix(str_split_fixed(dats$df, ":", 3))
Теперь мы должны разделить для каждого столбца значения на |
:
listed <- list() # empty list
for (i in (1:ncol(double_point))){
listed[[i]] <- (double_point[,i])
listed[[i]] <- str_split_fixed(listed[[i]], "\\|", 2)
}
# put as data frame
df_ <- do.call(cbind, listed)
# this is going to help in the future
df_1 <- df_
# result till now:
head(df_1)
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] "2" "" "02" "" "02" ""
[2,] "2" "" "-1" "" "-1" ""
[3,] "-1" "" "2" "" "-1" ""
[4,] "2" "" "-1" "" "-1" ""
[5,] "1(1)" "1(2)" "2" "" "2" ""
[6,] "1(1)" "1(2)" "2" "" "2" ""
Теперь мы должны заменить значения отображением и связать их с разбивкой исходных данных (в данном случае):
listed <- list()
for (i in (1:ncol(df_))){
df_[,i] <- gsub("0","",df_[,i])
listed[[i]] <- mapping[match(df_[,i], mapping$id), 2, drop=F]
}
df_final <- cbind(df_1,do.call(cbind, listed))
head(df_final)
1 2 3 4 5 6 value value value value value value
1 2 02 02 Homo <NA> Homo <NA> Homo <NA>
1.1 2 -1 -1 Homo <NA> No <NA> No <NA>
2 -1 2 -1 No <NA> Homo <NA> No <NA>
1.2 2 -1 -1 Homo <NA> No <NA> No <NA>
4 1(1) 1(2) 2 2 Het1 Het2 Homo <NA> Homo <NA>
4.1 1(1) 1(2) 2 2 Het1 Het2 Homo <NA> Homo <NA>
Надеюсь, это поможет!
РЕДАКТИРОВАТЬ
Здесь сопоставление dput()
и str()
:
dput(mapping)
structure(list(id = structure(c(5L, 1L, 2L, 3L, 4L), .Label = c("-1",
"1", "1(1)", "1(2)", "2"), class = "factor"), value = structure(c(4L,
5L, 1L, 2L, 3L), .Label = c("Het", "Het1", "Het2", "Homo", "No"
), class = "factor")), class = "data.frame", row.names = c("1",
"2", "3", "4", "5"))
str(mapping)
'data.frame': 5 obs. of 2 variables:
$ id : Factor w/ 5 levels "-1","1","1(1)",..: 5 1 2 3 4
$ value: Factor w/ 5 levels "Het","Het1","Het2",..: 4 5 1 2 3