【问题标题】:how to make a matrix in a for loop based on these data如何根据这些数据在 for 循环中制作矩阵
【发布时间】:2016-05-23 14:52:16
【问题描述】:

我的 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

我真的希望你能帮助我,在此先感谢

【问题讨论】:

    标签: r for-loop matrix


    【解决方案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 中出现的氨基酸名称的组合作为索引来填充最终矩阵。

    【讨论】:

    • 嗨,Imo,感谢您的快速回答。但是,我仍然无法以正确的方式完成它。我已经将氨基变量转换为“字符”,但是当我到达最后一行(#fill in the values)时,它给了我:myMat[cbind(dfAgg$amino1, dfAgg$amino2)]
    • 两列多行,但没有字符
    • 不幸的是,事实并非如此。
    • 它太大了,即使是
    • 我发布了原始数据的未修改版本。使用您编辑的版本,我仍然会收到错误消息。也许我错过了什么?在我的情况下,第一行(#构造示例数据框)应该如何?如果占用您太多时间,我很抱歉
    猜你喜欢
    • 2023-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多