Dataframe от длинного до широкого формата - PullRequest
0 голосов
/ 08 июля 2020

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

df <-  structure(list(Group = c("A", "A", "B", "B", "C", "C", "D", "D", 
"E", "E"), TEST_A = c("neg", "neg", "neg", "neg", "neg", "neg", 
"neg", "pos", "pos", "neg"), TEST_B = c("neg", "neg", "neg", 
"neg", "neg", "neg", "neg", "neg", "neg", "neg"), RESULT_NOW = c(0L, 
0L, 0L, NA, 0L, 0L, 0L, 0L, 0L, 0L), RESULTS_BEFORE = c(0L, 0L, 
0L, NA, 0L, 0L, 0L, 0L, 0L, 0L)), row.names = c(NA, 10L), class = "data.frame")

Выглядит следующим образом:

> df

    Group TEST_A TEST_B RESULT_NOW RESULTS_BEFORE
1      A    neg    neg          0              0
2      A    neg    neg          0              0
3      B    neg    neg          0              0
4      B    neg    neg         NA             NA
5      C    neg    neg          0              0
6      C    neg    neg          0              0
7      D    neg    neg          0              0
8      D    pos    neg          0              0
9      E    pos    neg          0              0
10     E    neg    neg          0              0

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

Group TEST_A_1 TEST_A_2 TEST_B_1 TEST_B_1 RESULT_NOW_1  RESULT_NOW_2 RESULTS_BEFORE_1 RESULTS_BEFORE_2
    A   neg        neg     neg     neg       0              0            0         0
    B   neg        neg     neg     neg       0              NA           0        NA
    C   neg        neg     neg     neg       0              0            0         0
    ...
    E   pos        neg     neg     neg       0              0            0         0
   

Так что на самом деле - переместить фрейм данных в широкий формат с помощью столбца «Группа». Обратите внимание, что столбец группы может содержать до 4 строк на группу. В этом примере только две строки на группу Спасибо за вашу помощь.

Ответы [ 2 ]

1 голос
/ 08 июля 2020

Вы можете попробовать следующее:

library(tidyverse)
library(reshape2)
#Melt
df2 <- reshape2::melt(df,id.vars = "Group")
df2 %>% group_by(Group,variable) %>%mutate(index=1:length(variable),variable=paste0(variable,'.',index)) %>%
  select(-index) -> df2
#Pivot
df2 %>%
  group_by(variable) %>% 
  mutate(row = row_number()) %>%
  pivot_wider(id_cols = c(row, Group),
              names_from = variable, 
              values_from = c(value)) %>%
  select(-row)

# A tibble: 5 x 9
  Group TEST_A.1 TEST_A.2 TEST_B.1 TEST_B.2 RESULT_NOW.1 RESULT_NOW.2 RESULTS_BEFORE.1 RESULTS_BEFORE.2
  <chr> <chr>    <chr>    <chr>    <chr>    <chr>        <chr>        <chr>            <chr>           
1 A     neg      neg      neg      neg      0            0            0                0               
2 B     neg      neg      neg      neg      0            <NA>         0                <NA>            
3 C     neg      neg      neg      neg      0            0            0                0               
4 D     neg      pos      neg      neg      0            0            0                0               
5 E     pos      neg      neg      neg      0            0            0                0 

Надеюсь, это вам поможет.

0 голосов
/ 08 июля 2020

Уловка состоит в том, чтобы сначала добавить столбец id. На втором этапе мы можем просто применить tidyr::pivot_wider для достижения желаемого результата:

df <-  structure(list(Group = c("A", "A", "B", "B", "C", "C", "D", "D", 
                                "E", "E"), TEST_A = c("neg", "neg", "neg", "neg", "neg", "neg", 
                                                      "neg", "pos", "pos", "neg"), TEST_B = c("neg", "neg", "neg", 
                                                                                              "neg", "neg", "neg", "neg", "neg", "neg", "neg"), RESULT_NOW = c(0L, 
                                                                                                                                                               0L, 0L, NA, 0L, 0L, 0L, 0L, 0L, 0L), RESULTS_BEFORE = c(0L, 0L, 
                                                                                                                                                                                                                       0L, NA, 0L, 0L, 0L, 0L, 0L, 0L)), row.names = c(NA, 10L), class = "data.frame")

library(dplyr)
library(tidyr)

df %>% 
  group_by(Group) %>% 
  mutate(id = row_number(Group)) %>%
  ungroup() %>% 
  pivot_wider(names_from = id, values_from = c(TEST_A, TEST_B, RESULT_NOW, RESULTS_BEFORE))
#> # A tibble: 5 x 9
#>   Group TEST_A_1 TEST_A_2 TEST_B_1 TEST_B_2 RESULT_NOW_1 RESULT_NOW_2
#>   <chr> <chr>    <chr>    <chr>    <chr>           <int>        <int>
#> 1 A     neg      neg      neg      neg                 0            0
#> 2 B     neg      neg      neg      neg                 0           NA
#> 3 C     neg      neg      neg      neg                 0            0
#> 4 D     neg      pos      neg      neg                 0            0
#> 5 E     pos      neg      neg      neg                 0            0
#> # ... with 2 more variables: RESULTS_BEFORE_1 <int>, RESULTS_BEFORE_2 <int>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...