如何根据这些数据在for循环中制作矩阵

时间:2016-05-23 14:52:16

标签: r for-loop matrix

我的R项目需要一些帮助。我想基于平均相对解理强度(RCI)制作矩阵。这是我的原始数据(mydata = 632 obs。的3个变量):

    R.Int amino1 amino2
1      14      W      I
2       0      K      E
3      79      Q      I
4      80      Q      I
5     100      K      V
6     100      K      V
7     100      K      P
8      24      K      P
9     100      K      I
10    100      K      I  
11    100      K      I
12    100      K      I
13    100      K      I
14    100      K      E
15      4      H      E
16      0      H      E
17      0      F      Y
18      0      F      Y
19      2      E      Q
20      2      E      Q

到目前为止,我已通过此代码计算了所有可能的氨基酸组合的平均RCI:

for (i in x)  {
  for (j in x) { 
   sub <- subset(mydata, mydata$amino1==LETTERS[i] & mydata$amino2==LETTERS[j])
   g <- group_by(sub, amino1) %>% summarize(m = mean(R.Int))
   h <- group_by(sub, amino2) %>% summarize(m = mean(R.Int))
   c <- cbind(g,h)
   d <- subset(c, select = -4)
   neworder <- d[, c(1,3,2)]
   n <- setnames(neworder, "m", "R.Int")
   if (nrow(sub) > 0)

   print(n)
 }
}

上面的代码给出了这个输出:

  amino1 amino2 R.Int
1      A      L    25
  amino1 amino2 R.Int
1      A      E    41
  amino1 amino2 R.Int
1      A      R  1.25
  amino1 amino2 R.Int
1      A      K    80
  amino1 amino2 R.Int
1      A      S   4.1
  amino1 amino2 R.Int
1      G      G    12
  amino1 amino2 R.Int
1      G      L     7
  amino1 amino2 R.Int
1      G      W     2
amino1 amino2 R.Int
1      G      Y     0
amino1 amino2 R.Int
1      G      D   0.4

我的问题是:如何在其上构建矩阵?我希望矩阵看起来像这样,每个可能的氨基酸组合的平均RCI值:

   A  G  I  L  P  V  F  W  Y  D  Q  E  R  H  K  S  T  C  M  N
N NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
M NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
c NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
T NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
S NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
K NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
H NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
R NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
E NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
Q NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
D NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
Y NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
W NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
F NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
V NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
P NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
L NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
I NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
G NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
A NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA

我真的希望你能帮助我,提前谢谢

1 个答案:

答案 0 :(得分:1)

以下是实现此目的的一种方法:

# construct example data frame
set.seed(1234)
df <- data.frame(R.int=sample(1:100, 25, replace=T), amino1=sample(letters[1:5], 25, replace=T), amino2=sample(letters[1:5], 25, replace=T), stringsAsFactors=F)

# make sure that amino1 and amino2 are character variables (not factors)
df$amino1 <- as.character(df$amino1)
df$amino2 <- as.character(df$amino2)

# calculate mean for each amino acid combination
dfAgg <- aggregate(cbind("R.Int"=R.Int)~amino1 + amino2, data=df, FUN=mean)

# construct matrix for storage, give it row and column names of amino acids
myMat <- matrix(0, nrow=length(unique(dfAgg$amino1)), ncol=length(unique(dfAgg$amino2)))
rownames(myMat) <- unique(dfAgg$amino1)
colnames(myMat) <- unique(dfAgg$amino2)

# fill in the values
myMat[cbind(dfAgg$amino1, dfAgg$amino2)] <- dfAgg$R.Int

请注意,此方法的氨基酸变量必须具有类型特征(即非因子)才能起作用。最后一行使用dfAgg data.frame中出现的氨基酸名称组合作为填充最终矩阵的索引。