【发布时间】: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 <- colnames(Data[,c(3:46)]),所以sub是一个列名向量。for (j in sub),所以j是每次迭代的列名。filter(Data, feature==i & sub==j)。我不知道你想在这里用sub == j完成什么,但是因为sub和j都是关于列的,所以它们不属于filter语句,它是关于行中的值的。j/subset$mean您不能将列名除以值。也许你想要Data[[j]] / subset$mean? -
我强烈建议使用更具描述性的变量名来使您的代码更清晰。
-
既然您使用的是
dplyr,summarize(Data, across(sample1:sample3, ~ . / mean))(替换您的所有代码)是否会产生预期的输出? -
您的方法中也丢失了
feature列,我在模仿我认为的做法。而是使用summarize(Data, feature, across(sample1:sample3, ~ . / mean)),您不会丢失它。阅读dplyr软件包的教程(从 dplyr.tidyverse.org 开始,当然也可以为其他人冒险),以更好地了解如何从 @ 中获取您需要的东西,例如 this,这对您很有帮助987654344@ 和summarize.