Невозможно точно конвертировать из длинного формата в широкоформатный в r - PullRequest
1 голос
/ 04 ноября 2019

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

 data_ige<-read.csv("serology.csv",header = TRUE,na.strings=0)</p>

<p>library(tidyverse)
library(magrittr)</p>

<p>data_new <- data_ige %>% spread(test, value)
 

У меня следующий набор данных существующий набор данных

После запуска кода он преобразует дату (но не так, как я хочу), как показано на следующем изображении, элементы, выделенные желтым цветом, показывают, что эти значения идут в нескольких строках, но они должны быть в первой строке, а не в новой. ,у каждого пациента были данные либо за 1 посещение, либо за 2 посещения. Итак, все результаты теста за 1 посещение, я хочу видеть их в одном ряду и результаты теста за 2 посещения во втором ряду.

После преобразования

Этот снимок экрана показываетжелаемый результат.

желаемый результат

Ответы [ 2 ]

1 голос
/ 04 ноября 2019

Это на самом деле хорошо работает для меня, когда я использую таблицу, на которую вы ссылаетесь. Возможно, проблема связана с вашими данными, то есть вы можете импортировать строки как факторы или что-то подобное. Попробуйте использовать приведенные ниже данные:

data_ige %>% spread(test, value)

#### OUTPUT ####

  ID date     1    3    4    5    6    7    8
1  A 2008 0.035   NA   NA   NA   NA   NA   NA
2  A 2011 2.750   NA   NA   NA   NA   NA   NA
3  B 2011 9.990 3.65 0.68 0.02 0.17 0.50 0.09
4  C 2008 0.000   NA   NA   NA   NA   NA   NA
5  C 2011 0.000   NA   NA   NA   NA   NA   NA
6  D 2008 0.000 0.00 0.00 0.00 0.00 0.59 0.00
7  D 2011 9.990 0.49 0.20 0.08 0.16 0.50 0.13

Одна вещь, которую вы можете сделать, - добавить строку для test == 2, которой нет в ваших данных. Таким образом, вы получите столбец 2 только с NA с, точно так же как изображение фрейма данных, на который вы ссылаетесь:

data_ige %>%
    add_row(ID = "A", date = 2008, test = 2) %>% 
    spread(test, value)

#### OUTPUT ####

  ID date     1  2    3    4    5    6    7    8
1  A 2008 0.035 NA   NA   NA   NA   NA   NA   NA
2  A 2011 2.750 NA   NA   NA   NA   NA   NA   NA
3  B 2011 9.990 NA 3.65 0.68 0.02 0.17 0.50 0.09
4  C 2008 0.000 NA   NA   NA   NA   NA   NA   NA
5  C 2011 0.000 NA   NA   NA   NA   NA   NA   NA
6  D 2008 0.000 NA 0.00 0.00 0.00 0.00 0.59 0.00
7  D 2011 9.990 NA 0.49 0.20 0.08 0.16 0.50 0.13

Вот фрейм данных, который я использовал:

data_ige <- structure(list(ID = c("A", "A", "B", "B", "B", "B", "B", "B", 
"B", "C", "C", "D", "D", "D", "D", "D", "D", "D", "D", "D", "D", 
"D", "D", "D", "D"), date = c(2008L, 2011L, 2011L, 2011L, 2011L, 
2011L, 2011L, 2011L, 2011L, 2008L, 2011L, 2008L, 2008L, 2008L, 
2008L, 2008L, 2008L, 2008L, 2011L, 2011L, 2011L, 2011L, 2011L, 
2011L, 2011L), test = c(1L, 1L, 1L, 3L, 4L, 5L, 6L, 7L, 8L, 1L, 
1L, 1L, 3L, 4L, 5L, 6L, 7L, 8L, 1L, 3L, 4L, 5L, 6L, 7L, 8L), 
    value = c(0.035, 2.75, 9.99, 3.65, 0.68, 0.02, 0.17, 0.5, 
    0.09, 0, 0, 0, 0, 0, 0, 0, 0.59, 0, 9.99, 0.49, 0.2, 0.08, 
    0.16, 0.5, 0.13)), class = "data.frame", row.names = c(NA, 
-25L))
1 голос
/ 04 ноября 2019

Нам нужно создать столбец последовательности, так как есть дубликаты

library(dplyr)
library(tidyr)
data_ige %>% 
   group_by(ID, date, test) %>%
   mutate(rn = row_number()) %>%
   ungroup %>%
   spread(test, value) %>%
   #or use pivot_wider as spread is getting deprecated
   #  pivot_wider(names_from = test, values_from = value) %>%
   select(-rn)
# A tibble: 8 x 9
#  ID     date    `1`   `3`   `4`   `5`   `6`   `7`   `8`
#  <fct> <dbl>  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 A      2008  0.035 NA    NA    NA    NA    NA    NA   
#2 A      2011  2.75  NA    NA    NA    NA    NA    NA   
#3 B      2011  9.99   3.65  0.68  0.02  0.17  0.5  NA   
#4 C      2008  0     NA    NA    NA    NA    NA    NA   
#5 C      2011 NA     NA    NA    NA    NA    NA     0.09
#6 D      2008  0      0     0     0     0     0.59  0   
#7 D      2011  0      0.49  0.2   0.08  0.16  0.5   0.13
#8 D      2011  9.99  NA    NA    NA    NA    NA    NA   

data

data_ige <- structure(list(ID = structure(c(1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 
3L, 3L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 
4L), .Label = c("A", "B", "C", "D"), class = "factor"), date = c(2008, 
2011, 2011, 2011, 2011, 2011, 2011, 2011, 2011, 2008, 2011, 2008, 
2008, 2008, 2008, 2008, 2008, 2008, 2011, 2011, 2011, 2011, 2011, 
2011, 2011), test = c(1, 1, 1, 3, 4, 5, 6, 7, 8, 1, 1, 1, 3, 
4, 5, 6, 7, 8, 1, 3, 4, 5, 6, 7, 8), value = c(0.035, 2.75, 9.99, 
3.65, 0.68, 0.02, 0.17, 0.5, 0.09, 0, 0, 0, 0, 0, 0, 0, 0.59, 
0, 9.99, 0.49, 0.2, 0.08, 0.16, 0.5, 0.13)), 
class = "data.frame", row.names = c(NA, 
-25L))
...