Транспонирование значений во фрейме данных на основе данных в двух столбцах - PullRequest
1 голос
/ 25 февраля 2020

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

df <- read.csv("data.csv", header = TRUE)
> df
       ID     Time     Expectation
1         cat  1.1           1
2         dog  1.0           2
3         dog  1.1           3
4  guinea_pig  1.0           7
5         cat  1.0           1
6  guinea_pig  3.8          10
7         cat  0.8           1
8         cat  2.1           1
9         cat  3.6           1
10 guinea_pig  3.0          16
11        dog  0.9           2
12 guinea_pig  2.7          15
13 guinea_pig  4.0          10
14        dog  5.2           6
15        dog  7.2           7

Например, строка для собаки будет читать: (2, 2, 3, 6, 7). Один для guinea_pig будет (7, 15, 16, 10, 10) и т. Д. c. Можно ли включить категориальные данные в качестве имен строк нового фрейма данных или матрицы?

Большое спасибо!

Ответы [ 4 ]

2 голосов
/ 25 февраля 2020

Вот простой способ:

library(data.table)

df[order(Time),list(list(Expectation)),.(ID)]

           ID             V1
1:        cat      1,1,1,1,1
2:        dog      2,2,3,6,7
3: guinea_pig  7,15,16,10,10
  • Сортировать строки по Time
  • Группировать по ID
  • Получить list из Expectation столбец
1 голос
/ 25 февраля 2020

Издание dplyr:

df %>%
  group_by(ID) %>%
  summarise(var = list(Expectation[order(Time)]))

# # A tibble: 3 x 2
#   ID         var      
#   <chr>      <list>   
# 1 cat        <int [5]>
# 2 dog        <int [5]>
# 3 guinea_pig <int [5]>

Чтобы увидеть внутренние значения, добавьте %>% print.data.frame:

#           ID               var
# 1        cat     1, 1, 1, 1, 1
# 2        dog     2, 2, 3, 6, 7
# 3 guinea_pig 7, 15, 16, 10, 10
1 голос
/ 25 февраля 2020

Вот базовое решение R, использующее aggregate + order, т. Е.

aggregate(Expectation~ID,df[order(df$ID,df$Time),],FUN = list)

, такое что

          ID       Expectation
1        cat     1, 1, 1, 1, 1
2        dog     2, 2, 3, 6, 7
3 guinea_pig 7, 15, 16, 10, 10
1 голос
/ 25 февраля 2020

Еще один простой способ использования dplyr:

library(dplyr)
library(tidyr)
df<-fread("
Index ID     Time     Expectation
1         cat  1.1           1
2         dog  1.0           2
3         dog  1.1           3
4  guinea_pig  1.0           7
5         cat  1.0           1
6  guinea_pig  3.8          10
7         cat  0.8           1
8         cat  2.1           1
9         cat  3.6           1
10 guinea_pig  3.0          16
11        dog  0.9           2
12 guinea_pig  2.7          15
13 guinea_pig  4.0          10
14        dog  5.2           6
15        dog  7.2           7")

df %>% group_by(ID) %>% dplyr::summarise(Expectation_All =paste(Expectation, collapse = ","))
# ID         Expectation_All
# <chr>      <chr>          
#   1 cat        1,1,1,1,1      
# 2 dog        2,3,2,6,7      
# 3 guinea_pig 7,10,16,15,10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...