2017-01-20 7 views
0

Я уверен, что на этот вопрос есть очень простой ответ. Я пытаюсь объединить оценки по темам на основе их уникального идентификатора. Вот тест набор данные (так называемый Aggregate_Test) Я создал, где ID является уникальным для субъекта, и StaticScore было сделано разными оценщики:Совокупная команда в R для объединения строк на основе уникальной структуры данных ID-вывода?

ID StaticScore 
1 6 
2 7 
1 5 
2 6 
3 7 
4 8 
3 4 
4 5 

После внимательного прочтения других должностей, я использовал агрегат для создания следующего набор данных с новыми столбцами:

StaticAggregate<-aggregate(StaticScore ~ ID, Aggregate_Test, c) 
    > StaticAggregate 

ID StaticScore.1 StaticScore.2 
1 1    6    5 
2 2    7    6 
3 3    7    4 
4 4    8    5 

кадр Эти данные имеют следующую ул:

> str(StaticAggregate) 
    'data.frame': 4 obs. of 2 variables: 
    $ ID   : num 1 2 3 4 
    $ StaticScore: num [1:4, 1:2] 6 7 7 8 5 6 4 5 

Если я пытаюсь создать новую переменную путем вычитания StaticScore. 1 из StaticScore.2, я получаю следующее сообщение об ошибке:

Staticdiff<-StaticScore.1-StaticScore.2 Error: object 'StaticScore.1' not found

Так, пожалуйста, помогите мне, - что эта структура данных, созданный агрегате? Матрица? Как я мог преобразовать StaticScore.1 и StaticScore.2 для разделения переменных или запретить это, каковы обозначения для вычитания одного из другого для создания новой переменной?

ответ

0

Мы можем сделать dcast создать формат wide из long и вычитать эти столбцы, чтобы создать «StaticDiff»

library(data.table) 
dcast(setDT(Aggregate_Test), ID~paste0("StaticScore", rowid(ID)), value.var="StaticScore" 
      )[, StaticDiff := StaticScore1 - StaticScore2] 

Что касается конкретного вопроса о aggregate поведении, мы просто конкатенации (c) 'StaticScore' по 'ID'. Поведение по умолчанию, чтобы создать matrix колонку в aggregate

StaticAggregate<-aggregate(StaticScore ~ ID, Aggregate_Test, c) 

Это можно проверить, посмотрев на str(StaticAggregate)

str(StaticAggregate) 
#'data.frame': 4 obs. of 2 variables: 
#$ ID   : int 1 2 3 4 
#$ StaticScore: int [1:4, 1:2] 6 7 7 8 5 6 4 5 

Как мы изменяем его в нормальных колонках?

Это может быть сделано с do.call(data.frame

StaticAggregate <- do.call(data.frame, StaticAggregate) 

Проверьте str снова

str(StaticAggregate) 
#'data.frame': 4 obs. of 3 variables: 
# $ ID   : int 1 2 3 4 
# $ StaticScore.1: int 6 7 7 8 
# $ StaticScore.2: int 5 6 4 5 

Теперь мы можем сделать calcuation как показан в посте ФПА в

StaticAggregate$Staticdiff <- with(StaticAggregate, StaticScore.1-StaticScore.2) 
StaticAggregate 
# ID StaticScore.1 StaticScore.2 Staticdiff 
#1 1    6    5   1 
#2 2    7    6   1 
#3 3    7    4   3 
#4 4    8    5   3 
0

Как str Выход, указанный в вопросе, указывает, StaticAggregate представляет собой двухстолбцовый data.frame, второй столбец которого представляет собой матрицу с двумя столбцами, StaticScore. Мы можем отобразить матрицу следующим образом:

StaticAggregate$StaticScore 
##  [,1] [,2] 
## [1,] 6 5 
## [2,] 7 6 
## [3,] 7 4 
## [4,] 8 5 

Чтобы создать новый столбец с разницей:

transform(StaticAggregate, diff = StaticScore[, 1] - StaticScore[, 2]) 
## ID StaticScore.1 StaticScore.2 diff 
## 1 1    6    5 1 
## 2 2    7    6 1 
## 3 3    7    4 3 
## 4 4    8    5 3 

Обратите внимание, что нет столбцов в StaticAggregate или StaticAggregate$StaticScore имени StaticScore.1 и StaticScore.2.StaticScore.1 в заголовке вывода данных data.frame обозначает только первый столбец матрицы StaticScore.

Причина, по которой матрица не имеет имен столбцов, заключается в том, что функция aggregatec не производит их. Если мы изменим оригинал aggregate на это, то они будут иметь имена:

StaticAggregate2 <- aggregate(StaticScore ~ ID, Aggregate_Test, setNames, c("A", "B")) 
StaticAggregate2 
## ID StaticScore.A StaticScore.B 
## 1 1    6    5 
## 2 2    7    6 
## 3 3    7    4 
## 4 4    8    5 

Теперь мы можем записать это, используя имена столбцов матрицы:

StaticAggregate2$StaticScore[, "A"] 
## [1] 6 7 7 8 

StaticAggregate2$StaticScore[, "B"] 
## [1] 5 6 4 5 

Следует отметить, что существует значительное преимущество из way R's aggregate работает, поскольку позволяет более простой доступ к результатам - k-ый столбец матрицы является k-м результатом агрегатной функции. Это контрастирует с тем, что k + 1-й столбец data.frame представляет k-й результат агрегатной функции. Возможно, это не похоже на упрощение, но для более сложных проблем это может быть значительным упрощением, если вам нужно получить доступ к статистической матрице. Конечно, вы всегда можете придавить его к 3 колонки, если вы хотите

do.call(data.frame, StaticAggregate) 

, но как только вы думаете об этом на некоторое время вы можете обнаружить, что структура обеспечивает фактически более удобным.

+0

Спасибо всем за их быстрый ответ и помощь. Полезно видеть различные подходы к решению проблемы. Функция do.call, похоже, выполняет то, что мне нужно, преобразуя столбцы матрицы в переменные. Я не могу найти много документации по нему - какие-либо предложения о том, где искать? – Jerry

+0

Как упоминалось, хотя do.call будет сгладить его, это не очень желательно. –