2015-02-20 3 views
0

Это может быть вопрос о задаче/вопрос управления данными или их комбинация. Я относительно новичок в R, и я широко настраиваю, как управлять данными в R vs. Stata (в качестве примера). Я читал подробно, но не нашел хорошего примера того, как (1) извлекать векторы из блока данных по группам; (2) применять функцию попарно против всех комбинаций этих векторов; и (3) выводят результаты в виде матрицы, поэтому я прошу вас, как это сделать. Я упростил все имена переменных/данные в примере ниже:Как использовать семейство apply в

У меня есть dataframe ДФ структурирован следующим образом:

id score1 score2 extravar1 extravar2 ..... 
1  10  9  a 1.4345124  
1  9  7  b 1.1133529 
1  5  5  c -0.1712851 
2  4  4  d -0.4924446 
2  3  2  junk -0.8136040 
2  6  6  junk 0.14987444 
3  5  6  junk 0.14331245 
etc 

Мне нужно создать ковариационную матрицу ID score1 подмножеств и ID score2 подмножеств. Другими словами, я хотел бы выполнить следующие расчеты для обоих score1 и score2:

cov(vector of df$score1 for id 1 only,df$score1 for id 1 only) 
cov(vector of df$score1 for id 1 only,df$score1 for id 2 only) 
cov(vector of df$score1 for id 1 only,df$score1 for id 3 only) 
. 
. 
. 
cov(vector of df$score1 for id 1 only,df$score1 for id 288 only) 
cov(vector of df$score1 for id 1 only,df$score1 for id 289 only) 
cov(vector of df$score1 for id 2 only,df$score1 for id 1 only) 
cov(vector of df$score1 for id 2 only,df$score1 for id 2 only) 
. 
. 
. 
cov(vector of df$score1 for id 289 only,df$score1 for id 288 only) 
cov(vector of df$score1 for id 289 only,df$score1 for id 289 only) 

и хотел бы данные для вывода на два (один носовой score1, один для score2) списков, dataframes или матриц который выглядит как (где s1-1 является score1 вектор ID = 1):

  1    2    3  ... 288   289 
1 cov(s1-1,s1-1) cov(s1-1,s1-2) cov(s1-1,s1-3) cov(s1-1,s1-288) cov(s1-1,s1-289) 
2 cov(s1-2,s1-1) cov(s1-2,s1-2) cov(s1-2,s1-3) cov(s1-2,s1-288) cov(s1-2,s1-289) 
3 cov(s1-3,s1-1) cov(s1-3,s1-2) cov(s1-3,s1-3) cov(s1-3,s1-288) cov(s1-3,s1-289) 
. 
. 
. 
288 cov(s1-288,s1-1) cov(s1-288,s1-2) cov(s1-288,s1-3) cov(s1-288,s1-288) cov(s1-288,s1-289) 
289 cov(s1-289,s1-1) cov(s1-289,s1-2) cov(s1-289,s1-3) cov(s1-289,s1-288) cov(s1-289,s1-289) 

Моя проблема заключается в том, что я бегу в проблемы (1) манипулируют данные так, что он находится в правильном формате для такого анализ и (2) решение о том, какая из применимых функций будет наиболее подходящей для использования (возможно, mapply?). В настоящее время я использую раскол, чтобы разделить данные на группы, но я потерял, как манипулировать его оттуда:

df.scores <- df[,c("id","score1","score2")] 
databy.id <- split(df.scores,df.scores$id) 

что дает список я не 100% ясно, о том, как манипулировать применить. голова (databy.id) выглядит примерно так:

$`1` 
      id score1  score2 
1   1  10   9 
2   1  9   7 
3   1  5   5 
4   1  4   4 
5   1  3   2 
... 

$`2` 
      id score1  score2 
1   2  8   3 
2   2  9   2 
3   2  10   1 
4   2  9   3 
5   2  4   9 
... 

$`3` 
      id score1  score2 
1   3  8   7 
2   3  3   4 
3   3  2   3 
4   3  4   6 
5   3  6   1 
... 

я могу (и есть) решили эту проблему с петлями, но предпочел бы не делать, а я в следующий раз необходимо повторно рандомизации оценки и моделирования/магазин много таких матриц (который чрезмерно длится с помощью петель). Должен ли я использовать ddply, mapply или некоторые другие функции? Есть ли у вас какие-либо предложения о том, как действовать?

ответ

0

Я узнал, что функция cov принимает матрицы. Я выяснил, как преобразовать все ID-векторы баллов в матрицу с использованием цикла и вычислить матрицу ковариаций таким образом. Тем не менее, это безвкусное решение, и я уверен, что есть лучший способ для инициализации фрейма данных я использую (где идентификаторы является вектором всех идентификаторов:

vectors.score1 <- data.frame("1"=databy.id[[1]]$score1) 
for (j in 2:length(ids)) { 
    vectors.score1[,toString(ids[j])] <- databy.id[[j]]$score1 
} 
covariances <- cov(vectors.score1,vectors.score1) 
colnames(covariances) <- ids 

Я бы интересен в более элегантное решение, чтобы изменить данные, если кто-то есть он

Edit: Исправлено именование переменной Impact ==> score1

+0

Это не похоже на ваш вопрос Там нет никакого упоминания о «Impact» в. вопрос. –

Смежные вопросы