繁体   English   中英

R嵌套两个变量的所有组合的循环结构

[英]R nested for loop structure for all combinations of two variables

我想根据另一个data.frame变量(或列表,如果出于某种原因最好与它们一起使用)的每个级别的条件,在data.frame变量的每个级别上运行一个函数。

如果其中一个变量达到某个条件(例如> 15),那么我想在每对变量上运行一个简单函数(例如product)并将结果添加到新列表中。 为了我的需要和其他人的未来需求,我希望有一个对任何条件和任何功能都灵活的解决方案。

我是Programming / R的新手,并且不知道如何适当构造for循环(或其他方法)以便为两个data.frame变量中的元素的所有组合运行函数。 看起来这确实应该很容易实现,但是我已经花了好几个小时才找到解决方案。

这是我正在处理的嵌套的for循环代码:

df1 <- data.frame(c(1, 2, 3))
df2 <- data.frame(c(10, 20, 30))

list1 <- list()
for (i in 1:length(df1)) {
  for (j in 1:length(df2)) {
    if (df2[j,] > 15) {
      list1[[i]] <-  df1[i,] * df2[j,]}
    }}
list1

当我运行当前代码时,我得到并清空列表结果:list()。 我想要返回的是这样的:

[[1]]
[1] 20

[[2]]
[1] 30

[[3]]
[1] 40

[[4]]
[1] 60

[[5]]
[1] 60

[[6]]
[1] 90

考虑sapply具有两个输入跨遍历nrow带有表转换的两个数据帧:

mat <- sapply(1:nrow(df2), function(i, j) ifelse(df2[j,] > 15, df1[i,]*df2[j,], NA),
              1:nrow(df1))

mat <- mat[!is.na(mat)]
mat
# [1] 20 30 40 60 60 90

as.list(mat)    
# [[1]]
# [1] 20
# 
# [[2]]
# [1] 30
# 
# [[3]]
# [1] 40
# 
# [[4]]
# [1] 60
# 
# [[5]]
# [1] 60
# 
# [[6]]
# [1] 90

有许多方法可以做到这一点,其中有两种:一种是for循环,另一种是矢量化。

for循环

您的代码中几乎没有错误, df1df2 length均为1。因此, ij仅设置为1。这可以通过使用nrow而不是length 另一件事是在循环外创建index以将结果分配给列表。 以下代码有效

df1 <- data.frame(c(1, 2, 3))
df2 <- data.frame(c(10, 20, 30))

list1 <- list()
index=0
for (i in 1:nrow(df1)) {
  for (j in 1:nrow(df2)) {
    if (df2[j,] > 15) {
      index=index+1
      list1[[index]] <-  df1[i,] * df2[j,]}
  }}
list1

[[1]]
[1] 20

[[2]]
[1] 30

[[3]]
[1] 40

[[4]]
[1] 60

[[5]]
[1] 60

[[6]]
[1] 90

向量化方式

使用expand.grid产生所需的组合和prod找到自己的产品

dat=expand.grid(df1[,1], df2[df2 > 15,1])
dat=dat[order(dat$Var1),]
apply(dat, 1, prod)

 1  4  2  5  3  6 
20 30 40 60 60 90 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM