[英]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
循環
您的代碼中幾乎沒有錯誤, df1
和df2
length
均為1。因此, i
和j
僅設置為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.