我有限的心理能力意味着我真的很难在R中执行以下任务,任何建议都会感激不尽!
我有100个数据帧当前存储为列表(my.dfs)。在每个数据帧内有六列(a,b,c,d,e,f)。行号在数据帧之间有所不同(80-150),但我认为这是无关紧要的。所有列都是数字。
我想计算数据帧1中列a的模式,然后计算数据帧2,3,4 ...到数据帧100,并将结果存储在新的向量(a.mode)中。所以a.mode应该有100个模式值,每个模式值来自一个数据帧。然后我希望对列b,c,d,e,f重复这一点,每个列都有自己的向量(b.mode,c.mode等)。
我的问题是R中的计算模式似乎并不简单。我使用包(modeest)和命令:
mlv(column.here, method="mfv")
所以我的代码目前看起来像这样:
library(modeest)
my.dfs
a.mode<-NULL
for( j in my.dfs){
a.mode<-c(a.mode, mlv(j[,"column.a"], method="mfv"))
}
然而,这会导致混乱的输出不正确。
同样我尝试过:
for( j in my.dfs){
a.mode<-c(a.mode, mlv(j$column.a, method="mfv"))
}
但我收到错误命令:
Error in j$column.a : $ operator is invalid for atomic vectors
我还尝试将我的列表分成100个独立的数据帧,以查看在不同的数据帧上运行循环是否更有效。但是,我没有将我的列表分成100个数据帧:
t<-1:100
for (q in 1:length(t)){
assign(paste("metric.data", t[q], sep=""), data.frame(subset(my.dfs[[q]])))
}
我不知道如何在每个数据帧中为所有100个计算column.a模式的数据帧运行循环并将它们存储在向量(a.mode)中,然后对column.b重复此操作,如上所述的column.c等。
任何想法和代码都会很棒
答案 0 :(得分:1)
您的代码存在以下问题:
它应该是for (j in 1:my.dfs) {...}
否则循环只会循环一次,因为j
没有取1
和my.dfs
之间的所有值。
究竟是什么my.dfs
?它看起来不像你在为它分配任何东西?如果您希望循环具有与列表my.dfs
中的数据框一样多的运行(假设它是dfs列表),您应该尝试runs <- length(my.dfs)
和for (j in 1:runs) {...}
。
您使用j
很可能是此处出现错误消息的原因。看起来你正在尝试使用j作为my.dfs
中元素的占位符,但它不能像那样工作。相反,你应该这样做:mlv(my.dfs[[j]],method="mfv")
。同样,错误消息告诉您j
是一个原子向量。它不包含您的数据框。正如我可以正确地解释那样,查看你的代码,它甚至不应该包含原子向量而是包含列表(同样,假设my.dfs
是dfs列表)。
还有一些其他问题,我建议,下次问一个问题时,请确保您的代码正确和/或不仅仅是伪代码,因为这会让您的问题变得非常混乱。
< / LI> 醇>如果我正确解释了代码背后的实际问题,那么问题是mlv
的输出实际上是一个列表而不是单个值。如果您想要单个值,可以像这样访问它:
my.data <- matrix(rnorm(1:10,5),byrow=F,nrow=10,ncol=5) # create example data
list.of.modes <- apply(my.data,2,mlv,method="mfv") # get the mode
vector.of.modes <- NULL # create the vector we want
for (i in 1:length(list.of.modes)) {
vector.of.modes[i] <- list.of.modes[[i]]$M #<---This is the interesting line
}
对于数据框和您的示例,这应该类似。你必须调整它,因为我发布的代码只是在必要时解释它背后的原理。