避免R中嵌套循环的数据转换

避免R中嵌套循环的数据转换,r,transform,nested-loops,R,Transform,Nested Loops,我有一个列联表数据矩阵,有6列37行。 我需要应用卡方变换来为对应分析提供行配置文件和列配置文件 不幸的是,有人告诉我,我需要使用嵌套循环来转换数据并执行CA(而不是用R中更合理的方法)。我得到了用于嵌套循环的结构: transformed.data=data0 for (row.index in 1:nrow(data)) { for (col.index in 1:ncol(data)) { transfomed.data[row.index,col.index]=

我有一个列联表数据矩阵,有6列37行。 我需要应用卡方变换来为对应分析提供行配置文件和列配置文件

不幸的是,有人告诉我,我需要使用嵌套循环来转换数据并执行CA(而不是用R中更合理的方法)。我得到了用于嵌套循环的结构:

transformed.data=data0

for (row.index in 1:nrow(data)) {
  for (col.index in 1:ncol(data)) {
    transfomed.data[row.index,col.index]=
       "TRANSFORMATION"[row.index,col.index]
  }
}
根据我对使用嵌套循环的理解,它将首先对行应用我的“转换”,然后对列应用我的“转换”

我希望对数据进行转换以获得行配置文件:

X(ij)/sum(X(i/sqrt(sum(X(j))

而我希望对数据进行转换以获得列配置文件:

X(ij)/sum(X(j/sqrt(sum(X(i))

在嵌套循环的最后一行中输入什么作为“转换”,以使其输出所需的配置文件转换。否则,如果我没有理解这里嵌套循环的意义,请描述它允许我做什么

这是我的数据子集的代码:

matrix(c(15366,2079,411,366,23223,2667,699,819,31632,2724,717,1473,49938,3111,1062,11964)
,nrow=4,ncol=4,byrow=T)
因此,仅使用此子集,我希望第一行的行配置文件为:

0.002432689 0.0003291397 6.506803e-05 5.794379e-05
第一列的列配置文件为:

0.0009473414, 0.0132572344, 0.0572742202, 0.0132863528 

您可以在这些类型的计算中使用它,甚至不需要一个循环。重写你的方程式,然后你会得到:

Xtrans[i,j]=X[i,j]/sum(X[i,])*sqrt(sum(X[j])

要获得表示项-sum(X[i,])*sqrt(sum(X[j])的矩阵,可以使用函数
outer()
%o%
,如下所示:

rowSums(X) %o% sqrt(colSums(X))
或者,对于列转换:

sqrt(rowSums(X)) %o% colSums(X)
TEST <- matrix(
               c(15366,2079,411,366,23223,2667,699,819,
                 31632,2724,717,1473,49938,3111,1062,11964),
                 nrow=4,ncol=4,byrow=T)

> TEST / (sqrt(rowSums(TEST)) %o% colSums(TEST))
             [,1]        [,2]        [,3]         [,4]
[1,] 0.0009473414 0.001455559 0.001053892 0.0001854284
[2,] 0.0011674098 0.001522501 0.001461474 0.0003383284
[3,] 0.0013770523 0.001346668 0.001298230 0.0005269580
[4,] 0.0016167998 0.001143812 0.001430074 0.0031831055
唯一需要做的就是将原始矩阵除以此矩阵,例如用于col变换:

sqrt(rowSums(X)) %o% colSums(X)
TEST <- matrix(
               c(15366,2079,411,366,23223,2667,699,819,
                 31632,2724,717,1473,49938,3111,1062,11964),
                 nrow=4,ncol=4,byrow=T)

> TEST / (sqrt(rowSums(TEST)) %o% colSums(TEST))
             [,1]        [,2]        [,3]         [,4]
[1,] 0.0009473414 0.001455559 0.001053892 0.0001854284
[2,] 0.0011674098 0.001522501 0.001461474 0.0003383284
[3,] 0.0013770523 0.001346668 0.001298230 0.0005269580
[4,] 0.0016167998 0.001143812 0.001430074 0.0031831055

您提到的卡方标准化实际上可以在
素食者
套餐的
decostand
功能中找到。请注意,默认情况下,该方法通过乘以矩阵总数的平方根进行调整。这在对应分析中是有意义的

如果不想使用此更正,则可以按如下方式获得列转换:

> require(vegan)
> decostand(TEST,method="chi.square",MARGIN=2)/sqrt(sum(TEST))
             [,1]         [,2]        [,3]        [,4]
[1,] 0.0009473414 0.0011674098 0.001377052 0.001616800
[2,] 0.0014555588 0.0015225011 0.001346668 0.001143812
[3,] 0.0010538924 0.0014614736 0.001298230 0.001430074
[4,] 0.0001854284 0.0003383284 0.000526958 0.003183106
attr(,"decostand")
[1] "chi.square"

你能添加一些示例数据来回答你的问题吗?需要输入数据集和预期结果。另外,您是否搜索过内置函数?谷歌的第一次成功让我受益匪浅。谢谢Chase,我将在第一篇文章中添加一些示例数据。关于本作业的第二个问题,我必须首先一步一步地进行对应分析,通过转换数据(我坚持的那一点)并对其进行PCA,然后通过corresp(原始数据)和ca(原始数据)以更合理的方式进行,听起来像是家庭作业?几条建议。1) 你不需要任何for循环,2)如果你使用
colSums()
rowSums()
3,你的公式会变得容易得多。当所有其他方法都失败时,你可以查看函数的源代码,看看其他作者是如何解决这个问题的。为此,在控制台中键入不带参数的函数名。这可以是一个包含上述信息的单行函数。预期结果是两个与原始数据行数和列数相同的矩阵吗?一个可以称为“行转换版本”,另一个可以称为“列转换版本”?%o%函数(外部)也可能有帮助。我知道这是家庭作业,但我想我们已经过了任务的截止日期,因此添加了一个类似R的解决方案