如何遍历所有行和特定列来计算函数?

Posted

技术标签:

【中文标题】如何遍历所有行和特定列来计算函数?【英文标题】:How to loop through all rows and specific columns to compute a function? 【发布时间】:2022-01-18 00:02:22 【问题描述】:

我不确定为什么会收到错误“较长的对象长度不是较短对象长度的倍数”?我已经用不同的数据框运行了类似的代码,它似乎可以工作。

 Data: 
   feature   mean   sample1  sample2 sample3
     a          3        4       8       7  
     b          4        3.4     3       6
     c          5        2       5       7

这是我正在使用的代码:

      datalist6 = matrix( nrow = length(unique(Data$feature)), ncol = length(sub), 
                dimnames = list(unique(Data$feature), unique(sub)))

                sub <- colnames(Data[,c(3:46)])
                for(i in Data$feature) 
                        for (j in sub)
                        subset <- filter(Data, feature==i & sub==j)
                         func <- j/subset$mean
              datalist6[i,j] <- func
                     
               

然后此代码将引发该错误。本质上,我试图计算列子集$mean中的方差系数和列3:46(子)中样本的方差。我正在尝试通过嵌套的 for 循环来确定每列每行(特征)的方差系数。

TIA!

【问题讨论】:

您可能正在使用dplyr::filter,请明确说明您正在使用的非基础包。好像有问题:你在定义之前使用了length(sub),说明datalist6的创建是使用了之前版本的sub,这样很容易出问题。 sub &lt;- colnames(Data[,c(3:46)]),所以sub 是一个列名向量。 for (j in sub),所以j 是每次迭代的列名。 filter(Data, feature==i &amp; sub==j)。我不知道你想在这里用sub == j 完成什么,但是因为subj 都是关于列的,所以它们不属于filter 语句,它是关于行中的值的。 j/subset$mean 您不能将列名除以值。也许你想要Data[[j]] / subset$mean 我强烈建议使用更具描述性的变量名来使您的代码更清晰。 既然您使用的是dplyrsummarize(Data, across(sample1:sample3, ~ . / mean))(替换您的所有代码)是否会产生预期的输出? 您的方法中也丢失了feature 列,我在模仿我认为的做法。而是使用summarize(Data, feature, across(sample1:sample3, ~ . / mean)),您不会丢失它。阅读 dplyr 软件包的教程(从 dplyr.tidyverse.org 开始,当然也可以为其他人冒险),以更好地了解如何从 @ 中获取您需要的东西,例如 this,这对您很有帮助987654344@ 和 summarize. 【参考方案1】:

不需要for 循环。

假设您使用的是dplyr

library(dplyr)
summarize(Data, feature, across(sample1:sample3, ~ . / mean))
#   feature  sample1  sample2  sample3
# 1       a 1.333333 2.666667 2.333333
# 2       b 0.850000 0.750000 1.500000
# 3       c 0.400000 1.000000 1.400000

如果您需要基础 R 解决方案,

cbind(Data["feature"], subset(Data, select = sample1:sample3) / Data$mean)
#   feature  sample1  sample2  sample3
# 1       a 1.333333 2.666667 2.333333
# 2       b 0.850000 0.750000 1.500000
# 3       c 0.400000 1.000000 1.400000

【讨论】:

以上是关于如何遍历所有行和特定列来计算函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过分隔行和列来创建gridview?

当前行和上一行之间具有特定值的窗口函数

确定是不是可以通过翻转 1 矩阵的行和列来达到给定二进制矩阵的算法

如何从qt模型中获取所有数据

如何将特定的行和列值乘以常数来创建新列?

如何循环遍历城市列表以计算它们之间的距离