【问题标题】:For-loop inside foreach() in RR中foreach()内的for循环
【发布时间】:2021-01-30 18:46:56
【问题描述】:

假设我们有以下名为data1的数据集。

id  v1  v2
1   5   0.5
1   4   0.5
1   6   0.5
2   2   0.2
2   3   0.2
2   7   0.2

我的目的是对data1 子集id 后创建的每个数据进行分析。以下是我不成功的代码。

library(parallel)
library(foreach)
library(doSNOW)

data2 <- list()
foreach(i = 1:length(unique(data1$id))) %dopar% {
  data2[i] <- subset(data1,data1$id==unique(data1$id)[i])
  a <- matrix(ncol = 3, nrow = length(data2[i]$v1)
   for (j in 1:length(data2[i]$v1)) {
         for (k in 1:3) {
            a[j,k] <- 1.5*data2[i]$v2
          }
      }
   return(a)
  }

非常感谢任何帮助。谢谢!

【问题讨论】:

  • 我建议在没有并行化的情况下先解决这个问题。但我不关注的一件事是xy[j, k] &lt;- 1.5 * data2[i]$v2。对于第一个 id 组中的此数据集,这将转换为 1.5 * c(0.5, 0.5, 0.5),将其分配回单个元素是不正确的。
  • 感谢您的提示。那是不正确的代码行。

标签: r for-loop foreach


【解决方案1】:

您在寻找split() 吗?此函数将根据第二个参数的不同值将您的单个数据框分成数据框列表。这是一个例子:

# Create sample data
data1 <- read.table(header = TRUE, text = '
id  v1  v2
1   5   0.5
1   4   0.5
1   6   0.5
2   2   0.2
2   3   0.2
2   7   0.2')

# Split data into separate data frames
lst <- split(data1, data1$id)

# View resulting list
lst
# $`1`
# id v1  v2
# 1  1  5 0.5
# 2  1  4 0.5
# 3  1  6 0.5
# 
# $`2`
# id v1  v2
# 4  2  2 0.2
# 5  2  3 0.2
# 6  2  7 0.2

一旦进入列表,您通常可以直接或使用应用函数将其发送到分析中。

【讨论】:

    猜你喜欢
    • 2016-02-02
    • 1970-01-01
    • 2019-08-25
    • 1970-01-01
    • 2016-01-26
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 2020-07-13
    相关资源
    最近更新 更多