计算多个数据帧和存储中多列的模式

时间:2013-10-23 15:25:27

标签: r loops mode

我有限的心理能力意味着我真的很难在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等。

任何想法和代码都会很棒

1 个答案:

答案 0 :(得分:1)

您的代码存在以下问题:

  1. 它应该是for (j in 1:my.dfs) {...}否则循环只会循环一次,因为j没有取1my.dfs之间的所有值。

  2. 究竟是什么my.dfs?它看起来不像你在为它分配任何东西?如果您希望循环具有与列表my.dfs中的数据框一样多的运行(假设它是dfs列表),您应该尝试runs <- length(my.dfs)for (j in 1:runs) {...}

  3. 您使用j很可能是此处出现错误消息的原因。看起来你正在尝试使用j作为my.dfs中元素的占位符,但它不能像那样工作。相反,你应该这样做:mlv(my.dfs[[j]],method="mfv")。同样,错误消息告诉您j是一个原子向量。它不包含您的数据框。正如我可以正确地解释那样,查看你的代码,它甚至不应该包含原子向量而是包含列表(同样,假设my.dfs是dfs列表)。

  4. 还有一些其他问题,我建议,下次问一个问题时,请确保您的代码正确和/或不仅仅是伪代码,因为这会让您的问题变得非常混乱。

    < / 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
    }
    

    对于数据框和您的示例,这应该类似。你必须调整它,因为我发布的代码只是在必要时解释它背后的原理。