如何使用申请家庭

时间:2015-02-20 21:58:02

标签: r apply covariance data-manipulation mapply

这可能是申请问题/数据管理问题/这些问题的组合。我是R的新手,并且正在广泛调整如何管理R与Stata中的数据(作为示例)。我已经广泛阅读,但还没有找到一个很好的例子,说明如何(1)逐个数据帧提取向量; (2)对这些向量的所有组合成对应用函数; (3)将结果输出为矩阵,所以我要问你们怎么做。我简化了以下示例中的所有变量名称/数据:

我的数据帧df结构如下:

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)

我希望将数据输出为两个(一个得分1,一个得分为2)列表,数据帧或矩阵(如果s1-1是id1的score1向量):

         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? )。目前,我使用split将数据分成组,但是我不知道如何从那里操作它:

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

这会产生一个列表我不是100%明确如何在应用中操作。 head(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还是其他一些功能?您对如何进行有任何建议吗?

1 个答案:

答案 0 :(得分:0)

我学会了cov函数接受矩阵。我已经弄清楚如何使用循环将分数的所有ID矢量改造成矩阵,并且我正在以这种方式计算协方差矩阵。然而,这是一个不优雅的解决方案,我很确定有一种更好的方法来初始化我正在使用的数据框架(其中id是所有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  

如果有人拥有它,我会更有兴趣在一个更优雅的解决方案来重塑数据

编辑:修复了变量Impact的命名==&gt; score1