2017-03-11 3 views
0

入れ子になったループを使用してデータセットをサブセット化しようとしました。残念ながら、正しく動作していないように見えます。私は警告が2回出てループがうまく動作しません。入れ子のループ内R:置き換えられる項目の数が置き換えの長さの倍数ではありません

ここでは短いコード例です。提示されたデータは単なる例であり、実際のデータセットははるかに大きい:手作業で値を取り上げる解決策は実現不可能である。私は制限する場合は自分が私のデータセットでちょうど最初の要素に、 "通常の"(つまり、ネストされたNOT)ループがうまくいく

Warning messages: 
1: In mysubset[[i]][j] <- mydata[[i]][which(mydata[[i]]$myInter == : 
    number of items to replace is not a multiple of replacement length 
2: In mysubset[[i]][j] <- mydata[[i]][which(mydata[[i]]$myInter == : 
    number of items to replace is not a multiple of replacement length 
3: In mysubset[[i]][j] <- mydata[[i]][which(mydata[[i]]$myInter == : 
    number of items to replace is not a multiple of replacement length 
4: In mysubset[[i]][j] <- mydata[[i]][which(mydata[[i]]$myInter == : 
    number of items to replace is not a multiple of replacement length 
5: In mysubset[[i]][j] <- mydata[[i]][which(mydata[[i]]$myInter == : 
    number of items to replace is not a multiple of replacement length 

# #If I don't use a nested loop (by just using the first element in both "mydata" and "unique_test"), things seem to work out 
# #But obviously, this is not really what I want to achieve (I can't just manually select every element in mydata and unique_test) 
mysubset <- list() 
for(i in 1:length(unique_test[[1]])){ 
    #Select myvalues whose myInter data equals the one found in unique_test and assign them to a new subset 
    mysubset[[i]] <- mydata[[1]][which(mydata[[1]]$myInter == unique_test[[1]][i]),][["myvalue"]] 
} 

# #Generate example data 
unique_test <- list() 
unique_test[[1]] <- c(178.5, 179.5, 180.5, 181.5) 
unique_test[[2]] <- c(269.5, 270.5, 271.5) 



tmp_dataframe1 <- data.frame(myID = c(268, 305, 268, 305, 268, 305, 306), 
          myvalue = c(1.150343, 2.830392, 1.150343, 2.830392, 1.150343, 2.830392, 1.150343), 
          myInter = c(178.5, 178.5, 179.5, 179.5, 180.5, 180.5, 181.5)) 

tmp_dataframe2 <- data.frame(myID = c(144, 188, 196, 300, 301, 302, 303, 97), 
          myvalue = c(1.293493, 3.286649, 1.408049, 0.469219, 11.143147, 0.687355, 0.508603, 0.654335), 
          myInter = c(269.5, 269.5, 269.5, 270.5, 270.5, 271.5, 185.5, 186.5)) 



mydata <- list() 
mydata[[1]] <- tmp_dataframe1 
mydata[[2]] <- tmp_dataframe2 
######################## 

# #Generate nested loop 
mysubset <- list() #Define list 

for(i in 1:length(unique_test)){ 
    #Prepare list of lists 
    mysubset[[i]] <- NaN 
    for(j in 1:length(unique_test[[i]])){ 
    #Select myvalues whose myInter data equals the one found in unique_test and assign them to a new subset 
    mysubset[[i]][j] <- mydata[[i]][which(mydata[[i]]$myInter == unique_test[[i]][j]),][["myvalue"]] 
    } 
} 

# #There are warnings and the nested loop is not really doing, what it is supposed to do! 

Rは、次の警告を与えます

私は最初に適切な次元でリストを開始する必要がありますか?しかし、もし次元が私のデータセットのすべての要素で同じでないなら、私はそれをどうやって行うのですか?(それで、最初にlength()関数を使わなければなりません) mydata [[1]]はmydata [2]と同じ次元ではありません。以下のリンクで提示 そのための解決策は、このデータセットには適用されません。

Error in R :Number of items to replace is not a multiple of replacement length

Error in `*tmp*`[[k]] : subscript out of bounds in R

私はそれは私が欠けている明白な何かかなり確信しているが、私はそれを見つけることができません。どんな助けでも大歓迎です!

ループなしで同じことを達成するより良い方法がある場合は、サブセットの行に沿ってapply()や何かがあると確信しています。残念ながら、私はそれらを素早く実装するための選択肢には慣れていません。

答えて

1

は単にlist()であなたの割り当てをラップ:私の理解に基づいて、これはunique_testの値を使用してmyvalueサブセットなければなりません。

mysubset[[i]][j] <- list(mydata[[i]][which(mydata[[i]]$myInter == unique_test[[i]][j]),][["myvalue"]]) 

か短いようwhich()が必要でも、外側角括弧されていません:あなたは、最初は空のリストを割り当て、それを展開する必要はありませんよう

mysubset[[i]][j] <- list(mydata[[i]][mydata[[i]]$myInter == unique_test[[i]][j], c("myvalue")]) 
また

は、溶液を塗布考えますそれに反復的に値をバインドします。ネストされたlapplysapplymapply、さらにrapplyは、1回のコールで必要なリストとディメンションを作成できます。 mapplyunique_testを仮定しますmydataは常に等しい長さのオブジェクトです。

# NESTED LAPPLY 
mysubset2 <- lapply(seq(length(unique_test)), function(i) { 
    lapply(seq(length(unique_test[[i]])), function(j){ 
    mydata[[i]][mydata[[i]]$myInter == unique_test[[i]][j], c("myvalue")] 
    }) 
}) 

# NESTED SAPPLY 
mysubset3 <- sapply(seq(length(unique_test)), function(i) { 
    sapply(seq(length(unique_test[[i]])), function(j){ 
     mydata[[i]][mydata[[i]]$myInter == unique_test[[i]][j], c("myvalue")] 
    }) 
}, simplify = FALSE) 

# NESTED M/LAPPLY 
mysubset4 <- mapply(function(u, m){ 
    lapply(u, function(i) m[m$myInter == i, c("myvalue")]) 
}, unique_test, mydata, SIMPLIFY = FALSE) 

# NESTED R/LAPPLY 
mysubset5 <- rapply(unique_test, function(i){ 
    df <- do.call(rbind, mydata) 
    lapply(i, function(u) df[df$myInter == u, c("myvalue")])  
}, how="list") 

# ALL SUBSETS EQUAL EXACTLY 
all.equal(mysubset, mysubset2) 
# [1] TRUE  
all.equal(mysubset, mysubset3) 
# [1] TRUE  
all.equal(mysubset, mysubset4) 
# [1] TRUE 
all.equal(mysubset, mysubset5) 
# [1] TRUE 
+0

ありがとうございました!これは問題を解決しました! – user6475

0

あなたはmysubsetの見た目を投稿できますか?ネストされたため、ネストされたforループのリストではなく、ベクター自体に数値ベクトルを割り当てるしようとしているよう

mysubset <- unique(unlist(lapply(unlist(unique_test),function(x) subset(mydata,myInter==x,select="myvalue")))) 
関連する問題