Разделение строк разделенных значений в 2 столбца одновременно - R - PullRequest
0 голосов
/ 26 мая 2019

Я ищу элегантный способ разделения и преобразования значений, разделенных точкой с запятой, из двух столбцов в строки.Данные выглядят так:

1        A0A024R442;E7ETB3;Q9ULA0;E7EMB6           443;465;447;382
2 A0A024R442;E7ETB3;Q9ULA0;E7EMB6;C9JBE1       323;345;327;262;309

Требуемый вывод:

A0A024R442        443
    E7ETB3        465
    Q9ULA0        447
  ...................
    C9JBE1        309

Количество элементов в столбцах всегда одинаково для каждой строки, как показано выше.Я пробовал функцию strsplit (), но думаю, что не могу разделить значения с разделителями на несколько столбцов одновременно (исправьте меня, если я ошибаюсь).

Буду признателен за любые предложения.

Ответы [ 3 ]

2 голосов
/ 26 мая 2019

база R:

data.frame(matrix(unlist(strsplit(as.matrix(df),";")),ncol=2))

          X1  X2
1 A0A024R442 443
2     E7ETB3 465
3     Q9ULA0 447
4     E7EMB6 382
5 A0A024R442 323
6     E7ETB3 345
7     Q9ULA0 327
8     E7EMB6 262
9     C9JBE1 309
2 голосов
/ 26 мая 2019

Вот вариант data.table

library(data.table)
DT <- fread(text, header = FALSE)

out <- DT[, lapply(.SD, tstrsplit, split = ";", fixed = TRUE), by = 1:nrow(DT)]
out[, nrow := NULL][]
#           V1  V2
#1: A0A024R442 443
#2:     E7ETB3 465
#3:     Q9ULA0 447
#4:     E7EMB6 382
#5: A0A024R442 323
#6:     E7ETB3 345
#7:     Q9ULA0 327
#8:     E7EMB6 262
#9:     C9JBE1 309

Или в baseR, используя strsplit вместо

DF <- read.table(text = text, stringsAsFactors = FALSE, header = FALSE)
as.data.frame(lapply(DF, function(x) unlist(strsplit(x, split = ";", fixed = TRUE))))

данные

text = "A0A024R442;E7ETB3;Q9ULA0;E7EMB6           443;465;447;382
A0A024R442;E7ETB3;Q9ULA0;E7EMB6;C9JBE1       323;345;327;262;309"
1 голос
/ 26 мая 2019

Также можно использовать separate_rows

library(tidyverse)
separate_rows(df1, c("V1", "V2"))
#          V1  V2
#1 A0A024R442 443
#2     E7ETB3 465
#3     Q9ULA0 447
#4     E7EMB6 382
#5 A0A024R442 323
#6     E7ETB3 345
#7     Q9ULA0 327
#8     E7EMB6 262
#9     C9JBE1 309

Или с использованием cSplit

library(splitstackshape)
cSplit(df1, c("V1", "V2"), ";", "long")

data

df1 <- structure(list(V1 = c("A0A024R442;E7ETB3;Q9ULA0;E7EMB6", 
      "A0A024R442;E7ETB3;Q9ULA0;E7EMB6;C9JBE1"
), V2 = c("443;465;447;382", "323;345;327;262;309")), 
  row.names = c(NA, 
-2L), class = "data.frame")
...