Добавление разрывов для разделения символов строк и преобразования этих новых строк в столбцы - PullRequest
0 голосов
/ 11 декабря 2018

Какой самый эффективный способ разбить символ строк ниже на несколько столбцов?

structure(list(a = structure(c(47L, 49L, 42L, 45L, 24L, 26L, 
17L, 9L, 10L, 2L, 5L, 12L, 14L, 50L, 40L, 30L, 20L, 1L, 19L, 
30L, 52L, 49L, 41L, 46L, 25L, 41L, 12L, 13L, 34L, 6L, 10L, 48L, 
38L, 44L, 23L, 38L, 36L, 12L, 28L, 4L, 31L, 8L, 11L, 8L, 9L, 
8L, 17L, 29L, 50L, 43L, 37L, 22L, 12L, 15L, 9L, 18L, 33L, 3L, 
27L, 16L, 32L, 7L, 37L, 51L, 35L, 39L, 21L, 33L, 35L, 39L), .Label = c(" 7.00", 
" 7.43", " 7.83", " 7.90", " 8.50", " 9.30", "0.20", "0.27", 
"0.30", "0.37", "0.43", "0.50", "0.53", "0.67", "0.87", "0.90", 
"1.00", "1.50", "1.67", "10.77", "12.00", "13.60", "14.73", "15.93", 
"16.47", "2.00", "2.17", "3.33", "3.53", "3.77", "4.17", "4.63", 
"4.67", "4.83", "5.07", "5.40", "5.77", "6.83", "6.93", "7.00", 
"7.17", "7.43", "7.83", "7.90", "8.50", "9.30", "Final", "A", 
"B", "C", "D", "Semifinal"), class = "factor")), class = "data.frame", row.names = c(NA, 
-70L))

Я ищу фрейм данных, который будет выглядеть следующим образом:

Final
2               A  B  
3            7.43  XX
4            8.50  XX
5           15.93  XX
6            2.00  XX
7            1.00  XX
8            0.30  XX
9            0.37  XX
10           7.43  XX
11           8.50  XX
12           0.50  XX
13           0.67  XX
Semifinal
22           A     C
23           7.17  XX
24           9.30  XX
25          16.47  XX
26           7.17  XX
27           0.50  XX
28           0.53  XX
29           4.83  XX
30           9.30  XX
31           0.37  XX
49          B      D
50           7.83  XX
51           5.77  XX
52          13.60  XX
53           0.50  XX
54           0.87  XX
55           0.30  XX
56           1.50  XX
57           4.67  XX
58           7.83  XX
59           2.17  XX
60           0.90  XX
61           4.63  XX
62           0.20  XX
63           5.77  XX

Я изучил strsplit (), но мне не ясно, как добавить в эту функцию разрывы, которые будут представлять собой буквы A, B, C и D.

Cheers,

1 Ответ

0 голосов
/ 11 декабря 2018

Функция strsplit предназначена для разбиения строк (одиночных, символьных векторов длины 1) на разные части.Вы можете использовать его, например, чтобы разделить «4,63» на 2 части: «4» и «63».Я думаю, это не то, что вы ищете.

Символ-вектор похож на массив строк, который у вас есть здесь.Что также является проблемой.Где вы взяли эти данные?Как и сейчас, это составляет чуть больше, чем что-то написанное на листе бумаги, никакой реальной логики не найти.Это просто ряд кусочков текста.Итак, сначала давайте разделим его.
Чтобы увидеть, где нужно разделение, мы ищем вещи, которые не похожи на число, где is.na(as.numeric(as.character(data$a))).Чтобы разделить на группы, мы используем функцию split вместе со счетчиком, сообщая, сколько экземпляров текста мы встретили.

spl <- split(as.character(data$a), cumsum(is.na(as.numeric(as.character(data$a)))))

(это даст вам предупреждение, которое вы можете игнорировать), а следующий шаг оставляет только цифры:

spl <- sapply(spl, function(s) as.numeric(s)[!is.na(as.numeric(s))])

(опять же, предупреждения).

Но, наконец, что делать с этими данными?

Ваш предлагаемый конечный результат на самом деле не data.frame.Конечно, вы можете создать что-то похожее на это, но то, как у вас есть заголовки между строками, не то, для чего создан R.Когда я смотрю на это, я понимаю, что последняя строка - это оценка «B» против «D», но это не в data.frame.Data.frame - это всего лишь одна таблица, которая выглядит так, как будто вы дали ей имена столбцов "Final", "" и "".И именно так компьютер / R будет читать это.Так что не очень полезно

Я думаю, что наиболее полезными для этих данных будут три отдельных data.frames, которые вам просто нужно назначить вручную:

Finals <- data.frame(nr=3:13, A=spl[[2]], B="XX")
Semi1 <- data.frame(nr=22:31, A=spl[[5]], C="XX")
Semi2 <- data.frame(nr=50:63, B=spl[[7]], D="XX")

Наконец, что делают XXзначит, просто "еще не известно"?Потому что, если вы назначите его таким образом, последний столбец будет символом (или фактором), что означает, что если вы назначите число для его части, это число будет преобразовано в строку.Я думаю, что было бы более полезно назначить назначенное неизвестное значение, которое R имеет: NA

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...