这可能是一个应用问题/一个数据管理问题/这些问题的组合。我对 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)
我希望将数据输出到两个(一个用于 score1,一个用于 score2)列表、数据帧或矩阵中,看起来像(其中 s1-1 是 id=1 的 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)决定哪些应用函数最适合使用(可能是映射?)。目前,我正在使用 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 还是其他一些功能?您对如何进行有什么建议吗?