1

我有两张桌子,m和epi。Epi 表包含 m 列的名称。

  head(m[,1:6])
         Geno    11DPW      8266         80647        146207    146227
1 SB002XSB012 0.87181895    G/G           C/C          G/G        A/A
2 SB002XSB018         Na    G/G           C/T          G/G        A/A
3 SB002XSB044   1.057744    G/G           C/C          G/G        A/A
4 SB002XSB051 1.64736814    G/G           C/C          G/G        A/A
5 SB002XSB067 0.69987475    A/G           C/C          G/G        A/G
6 SB002XSB073 0.60552177    A/G           C/C          G/G        A/G

    > dim(m)

[1]   167 28234
and 
head(epi)
       SNP1      SNP2
1  7789543   12846898
2 12846898  7789543
3 24862913  4603896
4  4603896   24862913
5 50592569  7789543
6 27293494   57162585

    dim(epi)

[1] 561   2

我想取每一行 Epi,并在 m 的 11DPW 上对 m 中的这 2 列进行双向方差分析。我试过了

f<-function (x) {
 anova(lm (as.numeric(m$"11DPW")~ m[,epi[x,1]]*m[,epi[x,2]]))
 }
apply(epi,1,f)

并得到错误:[.data.frame(m,,epi [x,1])中的错误:选择了未定义的列有什么建议吗?谢谢, 伊姆里

4

2 回答 2

1

暂时搁置使用整数作为列名的复杂性(也就是说,假设这个问题得到了正确处理)

"undefined columns selected"如果 中指示的列epi不存在,您仍然会收到错误m

offendingElements <- !sapply(epi, "%in%", colnames(m))

# since an offending element likely disqualifies the row from the anova test, identify the whole row
offendingRows <- which(offendingElements) %% nrow(epi)   

# perform your apply statement over:
epi[-offendingRows, ]



清理应用中使用的功能

当您使用apply(epi, 1, f)传递给每个调用的内容时,f是一整行epi. 因此,epi[x, 1]不是给你你想要的结果。例如,apply 语句的第 7 次迭代x相当于epi[7, ]. 因此,要获取第一列,您只需要x直接索引即可。因此,在您的功能中:

Instead of       epi[x, 1]   and    epi[x, 2]
You want to use  x[[1]]      and    x[[2]]

这是第一部分。其次,我们需要将整数作为列名来处理。非常重要:如果您使用 m[, 7823] 这将为您提供 m 的第 7823 列。您必须确保将整数转换为字符串,表明您希望列名为“7823”,而不是(必须)第 7823 列。

用于as.character此:

   m[, as.character(x[[1]])]

把它们放在一起

offendingElements <- !sapply(epi, "%in%", colnames(m))
offendingRows <- which(offendingElements) %% nrow(epi)   

apply(epi[-offendingRows, ], 1, function (x) 
   anova( lm ( as.numeric(m$"11DPW") ~ m[, as.character(x[[1]]) ] * m[, as.character(x[[2]]) ] ))
)




有另一种处理名称的方法,最简单的方法是使它们成为适当的字符串

# clean up the elements in epi
epi.clean <- sapply(epi, make.names)

# clean up m's column names
colnames(m) <- make.names(colnames(m))

# use epi.clean  in your apply statement.  Dont forget offendingRows
apply(epi.clean[-offendingRows, ], 1, function (x) 
   anova( lm ( as.numeric(m$"11DPW") ~ m[, x[[1]] ] * m[, x[[2]] ] ))
)
于 2012-12-17T19:35:52.850 回答
0

我怀疑你的值epi是数字,但你想要使用的是它们的字符等价物,因为列名m是字符串(即使这些字符串是由数字组成的)。试试这个:

m[[as.character(epi[x,])]] (ETC)

接线员很古怪,[[但很酷。

于 2012-12-17T13:34:27.233 回答