Изменить форму данных по группам - PullRequest
0 голосов
/ 30 октября 2019

У меня есть фрейм данных, где каждое наблюдение отделено от большого случая, где каждые 20 строк начинается новый случай, то есть строки 1:20 - случай 1, а 21:40 - случай два. Я хочу проанализировать каждый случай в целом, поэтому я хочу изменить данные на основе переменной CaseId, чтобы каждый случай был представлен в одном наблюдении без потери каких-либо данных. Я попробовал этот код.

train_clean <- train %>%
  group_by(CaseId) %>%
  summarise_all(function(train) paste0(train, collapse = "_")) %>%
  cSplit(names(.)[-1], '_')

Это частично сработало, когда каждый случай был представлен в одной строке, но в нем создавалось ровно удвоенное количество столбцов для каждой строки, так что вместо переменной X, имеющей X1 .. X20, где каждое наблюдение из необработанных данных представлено в одной строке для случая, я получаю от X1 до x40, но с X21: X40 будет пустым. Это происходит с каждой переменной в данных, есть ли что-то, что мне нужно настроить в моем коде, чтобы заставить его работать так, как мне бы хотелось.

Это основной пример того, что я хочу сделать, но в более широком масштабе.

       X         CaseID
1  73.91 20170907000118
2  74.67 20170907000118
3  71.07 20170907000139
4  66.46 20170907000139
           CaseID    X1    X2
1  20170907000118 73.91 74.67
2  20170907000139 71.07 66.46

Я ценю любую помощь, которую могу получить, спасибо

Ответы [ 3 ]

1 голос
/ 30 октября 2019

Основываясь на ваших данных образца, вот решение data.table

library(data.table)
#read in sample data
DT <- fread("X         CaseID
73.91 20170907000118
74.67 20170907000118
71.07 20170907000139
66.46 20170907000139")
#create rownubers by CaseID-group
DT[, id := rowid( CaseID )]
#cast to desired wide format
dcast( DT, CaseID ~ paste0("X", id), value.var = "X")

#            CaseID    X1    X2
# 1: 20170907000118 73.91 74.67
# 2: 20170907000139 71.07 66.46
0 голосов
/ 30 октября 2019

Попробуйте использовать следующее:

library(tidyr)
train_clean <- train %>%
     spread(key= caseID, value  = X)

Это должно работать так, как вы хотите, при условии, что во всех отдельных случаях имеется симметричное число наблюдений X.

Редактировать: Если выу вас есть пропущенные значения, которые вы можете установить fill =NA или любое другое значение, чтобы занять столбцы, где нет другого X для того случая, когда в других случаях есть один.

0 голосов
/ 30 октября 2019

Мы можем использовать pivot_wider из tidyr после создания столбца последовательности, сгруппированного по 'CaseID'

library(tidyr)
library(dplyr)
library(stringr)
df1 %>%  
  group_by(CaseID = as.character(CaseID)) %>%
  mutate(rn = str_c("X", row_number())) %>% 
  ungroup %>% 
  pivot_wider(names_from = rn, values_from = X)
# A tibble: 2 x 3
#  CaseID            X1    X2
#  <chr>          <dbl> <dbl>
#1 20170907000118  73.9  74.7
#2 20170907000139  71.1  66.5

data

df1 <- structure(list(X = c(73.91, 74.67, 71.07, 66.46), CaseID = c(20170907000118, 
20170907000118, 20170907000139, 20170907000139)), 
     class = "data.frame", row.names = c("1", 
"2", "3", "4"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...