在R中,如何使用一个表,在另一个表中定义用于双向ANOVA的列?

时间:2012-12-17 13:20:16

标签: r

我有两张桌子,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,然后在mDP的11DPW上以m为单位做这两列的拖曳anova。 我试过了

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])出错:选择了未定义的列 有什么建议 ? 谢谢, 音利

2 个答案:

答案 0 :(得分: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语句x的第7次迭代中,相当于epi[7, ]。因此,要获取第一列,您只需要直接索引x。因此,在你的功能中:

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

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

使用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]] ] ))
)

答案 1 :(得分:0)

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

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

[[运营商很古怪但非常酷。