簡體   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