我有两张桌子,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])出错:选择了未定义的列
有什么建议 ?
谢谢,
音利
答案 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,])]]
(等)
[[
运营商很古怪但非常酷。