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

在R中,如何使用一个表,在另一个表中定义用于双向方差分析的列?,r,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

我有两张桌子,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,并在11DPW的m中对这两列进行双向方差分析。 我试过了


f我怀疑您在
epi
中的值是数字,但您要使用的是它们的字符等价物,因为
m
中的列名是字符串(即使这些字符串由数字组成)。请尝试以下方法:

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


[[
运算符很奇怪,但很酷。

我怀疑您在
epi
中的值是数字,但您要使用的是它们的字符等价物,因为
m
中的列名是字符串(即使这些字符串是由数字组成的)。请尝试以下方法:

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


[[
运算符很奇怪,但很酷。

暂时不考虑使用整数作为列名的复杂性(即,假设此问题得到正确处理)

如果
epi
中指示的列不存在于
m
这是第一部分。第二,我们需要将整数作为列名处理。非常重要:如果使用m[,7823],这将得到m的第7823列。您必须确保将整数转换为字符串,这表明您需要名为“7823”的列,而不是(必要的)第7823列

用作.character
用于此:

   m[, as.character(x[[1]])]
把它们放在一起
有问题的元素暂时把使用整数作为列名带来的复杂性放在一边(也就是说,假设这个问题得到了正确处理)

如果
epi
中指示的列不存在于
m
这是第一部分。第二,我们需要将整数作为列名处理。非常重要:如果使用m[,7823],这将得到m的第7823列。您必须确保将整数转换为字符串,这表明您需要名为“7823”的列,而不是(必要的)第7823列

用作.character
用于此:

   m[, as.character(x[[1]])]
把它们放在一起
有问题的元素使用
as.formula
从字符串创建
lm
的公式,您可以使用
paste
进行组装。使用
as.formula
从字符串创建
lm
的公式,您可以使用
paste
进行组装。谢谢,R标识m[(epi[1,1])],但当我将其放入函数中时,如下所示:f您的函数
f
是否独立工作?仅尝试将
f
与您的
apply
调用分离,您可能会告诉
apply
epi
行中的值进行操作,但您的函数
f
需要矩阵
epi
作为输入。Thanks,R识别m[[(epi[1,1])],但当我将其放入函数中时,如下所示:f您的函数
f
是否自行工作?仅尝试将
f
与您的
apply
调用分开,您可能会告诉
apply
epi
行中的值进行操作,但您的函数
f
需要矩阵
epi
作为输入。
Instead of       epi[x, 1]   and    epi[x, 2]
You want to use  x[[1]]      and    x[[2]]
   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]] ] ))
)