Создание новой строки из комбинации двух строк символьного типа в кадре данных - PullRequest
3 голосов
/ 03 июля 2019

У меня есть гораздо более крупная версия следующего набора данных.

mydata <- data.frame("C1" = c("EB", "L", 1, 2, 3) ,
                            "C2" = c("WB", "T", 4, 5, 6),
                            "C3" = c("NB", "R", 7, 8, 9),
                            "C4" = c("SB", "Total", 12, 15, 18),
                            "C5" = c("", "L",1, 2, 3),
                            "C6" = c("", "TR", 4, 5, 6),
                            "C7" = c("", "Total", 5, 7, 9),
                            "C8" = c("", "L",1, 2, 3),
                            "C9" = c("", "R", 4, 5, 6),
                            "C10" = c("", "Total", 5, 7, 9),
                            "C11" = c("", "L",1, 2, 3),
                            "C12" = c("", "TR", 4, 5, 6),
                            "C13" = c("", "Total", 5, 7, 9), stringsAsFactors = FALSE)

> mydata
  C1 C2 C3    C4 C5 C6    C7 C8 C9   C10 C11 C12   C13
1 EB WB NB    SB                                      
2  L  T  R Total  L TR Total  L  R Total   L  TR Total
3  1  4  7    12  1  4     5  1  4     5   1   4     5
4  2  5  8    15  2  5     7  2  5     7   2   5     7
5  3  6  9    18  3  6     9  3  6     9   3   6     9

Мне нужна комбинация первых двух строк, чтобы результирующий набор данных выглядел примерно так

    > myresult
   C1  C2  C3      C4  C5   C6      C7  C8  C9     C10 C11  C12     C13
1 EBL EBT EBR EBTotal WBL WBTR WBTotal NBL NBR NBTotal SBL SBTR SBTotal
2   1   4   7      12   1    4       5   1   4       5   1    4       5
3   2   5   8      15   2    5       7   2   5       7   2    5       7
4   3   6   9      18   3    6       9   3   6       9   3    6       9

По сути, я хочу сохранить оставшуюся часть фрейма данных как есть.

Обратите внимание: это ситуация из очень большого набора данных с 1000 записей и 18 столбцами.Любая помощь будет высоко ценится.Заранее спасибо!

Обновление: я пробовал

mydata[1,]= paste0(rep(mydata[1,], each = length(mydata[2,])), mydata[2,])

, но это просто повторяет одно значение из первого ряда

C1  C2  C3      C4  C5   C6      C7  C8  C9     C10 C11  C12     C13
1 EBL EBT EBR EBTotal EBL EBTR EBTotal EBL EBR EBTotal EBL EBTR EBTotal
2   L   T   R   Total   L   TR   Total   L   R   Total   L   TR   Total
3   1   4   7      12   1    4       5   1   4       5   1    4       5
4   2   5   8      15   2    5       7   2   5       7   2    5       7
5   3   6   9      18   3    6       9   3   6       9   3    6       9

Ответы [ 2 ]

2 голосов
/ 03 июля 2019

Глядя на данные, похоже, что вы хотите вставить первую строку комбинации со второй строкой, пока значение "Total" не войдет во вторую строку. Мы можем извлечь первую и вторую строки отдельно, split их, основываясь на вхождении "Total", и вставить их с first_row, чтобы получить новые значения.

first_row <- mydata[1, ]
first_row <- first_row[first_row != ""]
second_row <- as.character(mydata[2, ])
mydata[1, ] <- unlist(Map(paste0,first_row, split(second_row, 
                c(0, cumsum(second_row == "Total")[-length(second_row)]))))
mydata <- mydata[-2, ] 

mydata
#   C1  C2  C3      C4  C5   C6      C7  C8  C9     C10 C11  C12     C13
#1 EBL EBT EBR EBTotal WBL WBTR WBTotal NBL NBR NBTotal SBL SBTR SBTotal
#3   1   4   7      12   1    4       5   1   4       5   1    4       5
#4   2   5   8      15   2    5       7   2   5       7   2    5       7
#5   3   6   9      18   3    6       9   3   6       9   3    6       9
1 голос
/ 03 июля 2019

Вы должны повторить «EB» четыре раза, а остальные только три раза. Я думаю, что теперь это правильно:

colnames(mydata) <- paste0(c(rep(mydata[1,1], 4), rep(mydata[1, 2:4], each = 3)), mydata[2,])
mydata2 <- apply(mydata[-c(1:2),], 2, as.numeric)

> mydata2
     EBL EBT EBR EBTotal WBL WBTR WBTotal NBL NBR NBTotal SBL SBTR SBTotal
[1,]   1   4   7      12   1    4       5   1   4       5   1    4       5
[2,]   2   5   8      15   2    5       7   2   5       7   2    5       7
[3,]   3   6   9      18   3    6       9   3   6       9   3    6       9

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