От длинного до широкого формата путем сбора нескольких столбцов идентификаторов в R, которые имеют разные значения - PullRequest
0 голосов
/ 25 марта 2020

Я знаю, что есть много руководств по переходу от длинного формата к широкому. Например, см. здесь .

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

>  my.df <- data.frame(ID=rep(c("A","B","C"), 3), TIME=rep(1:9, each=1), X=1:9, Y=10:18)
>  my.df
  ID TIME X  Y
1  A    1 1 10
2  B    2 2 11
3  C    3 3 12
4  A    4 4 13
5  B    5 5 14
6  C    6 6 15
7  A    7 7 16
8  B    8 8 17
9  C    9 9 18

Я хочу перейти от длинного к широкому формату, но я хочу сохранить уникальную информацию, содержащуюся в столбце времени, и не хочу, чтобы она распространялась в имя столбца. Я хочу создать несколько столбцов времени, в которых есть дубликат идентификатора, и сохранить соответствующие данные X и Y рядом с этим столбцом.

См. Ниже требуемый вывод:

> my.df <- data.frame(ID=c("A","B","C"), TIME_1=c(1,2,3),X_1 = c(1,2,3), Y_1= c(10,11,12),
+                     TIME_2 = c(4,5,6),X_2 = c(4,5,6),Y_2 = c(13,14,15),
+                     TIME_3 = c(7,8,9),X_3 = c(7,8,9),Y_3 = c(16,17,18))
> my.df
  ID TIME_1 X_1 Y_1 TIME_2 X_2 Y_2 TIME_3 X_3 Y_3
1  A      1   1  10      4   4  13      7   7  16
2  B      2   2  11      5   5  14      8   8  17
3  C      3   3  12      6   6  15      9   9  18

Это возможный?

Мой реальный кадр данных намного больше, и столбец TIME содержит уникальные даты, которые я не могу вставить в имя столбца, поэтому я хочу сохранить эту информацию в новых столбцах. Я знаю, что у меня есть только 4 дублированных значения идентификатора, поэтому я не беспокоюсь о создании непомерного количества столбцов.

Ответы [ 2 ]

1 голос
/ 25 марта 2020

Использование reshape из базы R. ave идентифицирует три последовательных seq влияния в данных примера.

reshape(transform(my.df, t2=with(my.df, ave(TIME, ID, FUN=seq))), idvar=c("ID"),
        timevar=c("t2"), direction="wide")
#   ID TIME.1 X.1 Y.1 TIME.2 X.2 Y.2 TIME.3 X.3 Y.3
# 1  A      1   1  10      4   4  13      7   7  16
# 2  B      2   2  11      5   5  14      8   8  17
# 3  C      3   3  12      6   6  15      9   9  18
0 голосов
/ 25 марта 2020

Мы можем использовать dcast из data.table

library(data.table)
dcast(setDT(my.df), ID ~ rowid(ID), value.var = c("TIME", "X", "Y"))
#   ID TIME_1 TIME_2 TIME_3 X_1 X_2 X_3 Y_1 Y_2 Y_3
#1:  A      1      4      7   1   4   7  10  13  16
#2:  B      2      5      8   2   5   8  11  14  17
#3:  C      3      6      9   3   6   9  12  15  18

Или использовать tidyverse

library(dplyr)
library(tidyr)
my.df %>% 
    mutate(ind = rowid(ID)) %>% 
    pivot_wider(names_from = ind, values_from = c(TIME, X, Y))
# A tibble: 3 x 10
#  ID    TIME_1 TIME_2 TIME_3   X_1   X_2   X_3   Y_1   Y_2   Y_3
#  <fct>  <int>  <int>  <int> <int> <int> <int> <int> <int> <int>
#1 A          1      4      7     1     4     7    10    13    16
#2 B          2      5      8     2     5     8    11    14    17
#3 C          3      6      9     3     6     9    12    15    18

Если нам нужно, чтобы столбцы были упорядочены в определенном порядке. c way

my.df %>% 
     mutate(ind = rowid(ID)) %>% 
     pivot_wider(names_from = ind, values_from = c(TIME, X, Y)) %>%
     select(ID, order(readr::parse_number(names(.)[-1])) + 1)
# A tibble: 3 x 10
#  ID    TIME_1   X_1   Y_1 TIME_2   X_2   Y_2 TIME_3   X_3   Y_3
#  <fct>  <int> <int> <int>  <int> <int> <int>  <int> <int> <int>
#1 A          1     1    10      4     4    13      7     7    16
#2 B          2     2    11      5     5    14      8     8    17
#3 C          3     3    12      6     6    15      9     9    18
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...