1

我有限的心智能力意味着我真的很难在 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 重复此操作等等,如上所述。

任何想法和代码都会很棒

4

1 回答 1

1

您的代码有几个问题:

  1. 应该是,for (j in 1:my.dfs) {...}否则循环将只循环一次,因为j不会采用 and 之间的所有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. 还有一些其他问题,我建议,下次您提出问题时,请确保您的代码是正确的和/或不仅仅是伪代码,因为它会使您的问题非常混乱。

如果我正确解释了代码背后的实际问题,那么您的问题是输出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
}

对于数据框和您的示例,这应该同样适用。但是,您必须对其进行调整,因为我发布的代码仅在必要时解释其背后的原理。

于 2013-12-04T12:00:50.403 回答