如何遍历所有行和特定列来计算函数?
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 <- 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
.
【参考方案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
【讨论】:
以上是关于如何遍历所有行和特定列来计算函数?的主要内容,如果未能解决你的问题,请参考以下文章