Разбить несколько несовместимых столбцов на строки в R - PullRequest
0 голосов
/ 30 января 2019

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

P_ID    S_ID    Action    A1    A2    A4    A5    A6   A8
 101    1001         1  1015     0              
 102    1002         1  1016     0  1027           0    
 103    1003         1        1019     1        1030    1
 104    1004         1  1017     0  1028           0    

Просто прикрепите снимок, если отступ не верен: enter image description here

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

P_ID    S_ID    Action
 101    1001         1
 101    1015         0
 102    1002         1
 102    1016         0
 102    1027         0
 103    1003         1
 103    1019         1
 103    1030         1
 104    1004         1
 104    1017         0
 104    1028         0

Я могу разбить столбцы на строки, но когда между ними есть пустая ячейка (см. P_ID = 104), я не могу заставить это работать.Может кто-нибудь предложить способ справиться с этим?Я проверил похожие вопросы, опубликованные ранее, но не смог найти что-то подходящее для этой проблемы.

Вот вывод dput():

This is the updated dput output:

structure(list(P_ID = c(10264547L, 28790961L, 25389968L, 20368912L, 
12335739L, 28386707L, 29613504L, 13241475L, 7641351L, 7642873L, 
30836625L, 20437550L, 29363410L, 7641147L), S_ID = c(13324763L, 
13083449L, 13324759L, 13393573L, 13516358L, 13083449L, 13324763L, 
13324763L, 13432404L, 13432474L, 13324763L, 13324763L, 13324763L, 
13433044L), Action = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 1L, 
1L, 0L, 0L, 1L), A1 = c(13324759L, 13324763L, NA, 13324763L, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, 13324763L), A2 = c(0L, 0L, 
13083466L, 0L, NA, 13432417L, 13324759L, 13432457L, NA, 13432449L, 
13324759L, 13324759L, 13324759L, 0L), A4 = c(NA, 13324759L, 1L, 
13324759L, NA, 1L, 1L, 1L, NA, 1L, 1L, 0L, 0L, 13324759L), A5 = c(NA, 
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), A6 = c(NA, 
0L, 13432524L, 0L, NA, 13432457L, NA, NA, NA, 13432538L, NA, 
NA, NA, 0L), A8 = c(NA, NA, 1L, NA, NA, 1L, NA, NA, NA, 1L, NA, 
NA, NA, 13083449L), A9 = c(NA, NA, 13324763L, NA, NA, NA, NA, 
NA, NA, NA, NA, NA, NA, NA), A10 = c(NA, NA, 0L, NA, NA, 13432449L, 
NA, NA, NA, 13432530L, NA, NA, NA, 0L), A12 = c(NA, NA, NA, NA, 
NA, 1L, NA, NA, NA, 1L, NA, NA, NA, NA), A13 = c(NA, NA, NA, 
NA, NA, NA, NA, NA, NA, 13083449L, NA, NA, NA, NA), A14 = c(NA, 
NA, NA, NA, NA, 13432538L, NA, NA, NA, 0L, NA, NA, NA, NA), A16 = c(NA, 
NA, NA, NA, NA, 1L, NA, NA, NA, NA, NA, NA, NA, NA), A17 = c(NA, 
NA, NA, NA, NA, 13324763L, NA, NA, NA, NA, NA, NA, NA, NA), A18 = c(NA, 
NA, NA, NA, NA, 0L, NA, NA, NA, NA, NA, NA, NA, NA), A20 = c(NA, 
NA, NA, NA, NA, 13324759L, NA, NA, NA, NA, NA, NA, NA, NA)), .Names = c("P_ID", 
"S_ID", "Action", "A1", "A2", "A4", "A5", "A6", "A8", "A9", "A10", 
"A12", "A13", "A14", "A16", "A17", "A18", "A20"), class = "data.frame", row.names = c(NA, 
-14L))

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Если я правильно понимаю, есть две проблемы:

  1. В каждой строке P_ID есть несколько пар значений S_ID и Action, но значения не выровнены должным образом из-зав вкрапленные пустые (NA) ячейки.
  2. Данные должны быть преобразованы из широкого в длинный формат, что приводит к триплетам P_ID, S_ID и Action.

В приведенном ниже подходе используются melt(), dcast() и rowid() из пакета :

library(data.table)
melt(setDT(df), "P_ID", na.rm = TRUE)[
  order(P_ID), variable := 1:2][
    , dcast(.SD, P_ID + rowid(P_ID, variable) ~ variable)][, P_ID_1 := NULL][]

    P_ID S_ID Action
 1:  101 1001      1
 2:  101 1015      0
 3:  102 1002      1
 4:  102 1016      0
 5:  102 1027      0
 6:  103 1003      1
 7:  103 1019      1
 8:  103 1030      1
 9:  104 1004      1
10:  104 1017      0
11:  104 1028      0
0 голосов
/ 30 января 2019
df = read.table(text=gsub('NA','',do.call(paste,df)),fill=T)
b = na.omit(reshape(df,matrix(2:ncol(df),2),idvar = 'V1',dir='long'))
`rownames<-`(b[order(b$V1),][-2], NULL)
    V1   V2 V3
1  101 1001  1
2  101 1015  0
3  102 1002  1
4  102 1016  0
5  102 1027  0
6  103 1003  1
7  103 1019  1
8  103 1030  1
9  104 1004  1
10 104 1017  0
11 104 1028  0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...