我在這里有一個簡單的問題。
我正在嘗試查找 R 中的向量中是否存在重復值。例如,給定以下向量:
numbers <- c(10, 45, 32, 10, 56, 43, 32, 9)
我想創建一個嵌套在 for 回圈中的 for 回圈,以查找是否有任何值出現不止一次(即 10 和 32)。
我想用嵌套的 for 回圈來做,因為我想練習用 R 做這個。
我已經在 Python 中完成了一個可以成功找到重復值的作業腳本:
numbers = [10, 45, 32, 10, 56, 43, 32, 9]
def similars(ourlist, container):
for i in range(len(ourlist)):
k = i 1
for j in range(k, len(ourlist)):
if ourlist[i]==ourlist[j] and ourlist[i] not in container:
container.append(ourlist[i])
return container
container1=[]
similars(numbers, container1)
print(container1)
以上是 Python 代碼,它在我列印時找到重復的值 10 和 32(并原諒可能的縮進錯誤,將其傳輸到 StackOverflow 時縮進有點混亂 :-))。
我在下面有一些 R 代碼嘗試做同樣的事情:
numbers <- c(10, 45, 32, 10, 56, 43, 32, 9)
similars <- function(ourlist, container){
for (i in 1:length(ourlist)){
k <- i 1
for (j in k:length(ourlist)){
if (ourlist[i] == ourlist[j] & !(ourlist[i] %in% container)){
container[i] <- ourlist[i]
}
}
}
return (container)
}
container1 <- c()
similars(numbers, container1)
print(container1)
但是,當我嘗試運行它時收到以下錯誤訊息:
Error in if (ourlist[i] == ourlist[j] & !(ourlist[i] %in% container)) { :
missing value where TRUE/FALSE needed
Calls: similars
Execution halted
I feel there is a simple answer to it, but grudginly, I do not seem to be able to intuit it. Do any of you know why it says "missing value where TRUE/FALSE needed" when the same error does not occur in Python, and perhaps also how to fix the error in R?
In advance, thank you.
Best regards
uj5u.com熱心網友回復:
回圈可以是單個回圈而不是嵌套回圈 - 回圈從第二個元素到最后length一個if元素ourlist[i]的序列(帶有當前元素的“容器”并通過賦值更新 ( )%in%seq!c<-
similars <- function(ourlist, container){
for(i in 2:length(ourlist)) {
if(ourlist[i] %in% ourlist[seq(i-1)] & !(ourlist[i] %in% container)) {
container <- c(container, ourlist[i])
}
}
container
}
-測驗
> container1 <- c()
> similars(numbers, container1)
[1] 10 32
可以使用 in 以更簡單的方式duplicated完成R
> numbers[duplicated(numbers)]
[1] 10 32
關于為什么會出錯,評論里已經說明了 Regarding the issue in code your outer loop will be till the last element, then you are assigning k <- i 1, which will be outside the index
uj5u.com熱心網友回復:
您的內部回圈超出了
ourlist. 這個例子i將從 1 迭代到 8 (length(ourlist)); 在最后一次迭代中,當i為 1 時,您呼叫k <- i 1,使其成為9。然后迭代jfromktolength(ourlist)which 計算結果為9:8(遞減序列,長度為 2)。答案是,知道您想將一個元素與其后面的元素進行比較,您
i必須迭代到但不包括length(ourlist). 這樣,您k <- i 1的長度永遠不會超過ourlist.一個字面修復:
similars <- function(ourlist, container){ for (i in 1:(length(ourlist)-1)) { k <- i 1 for (j in k:length(ourlist)){ if (ourlist[i] == ourlist[j] & !(ourlist[i] %in% container)){ if (is.na(ourlist[i])) browser() container[i] <- ourlist[i] } } } return (container) } similars(numbers, container1) # [1] 10 NA 32- 下一期:為什么
NA?那是因為您在 index 處分配給輸出i,而不一定是“將一個元素附加到輸出”。讓我們做追加:
similars <- function(ourlist, container){ for (i in 1:(length(ourlist)-1)) { k <- i 1 for (j in k:length(ourlist)){ if (ourlist[i] == ourlist[j] & !(ourlist[i] %in% container)){ if (is.na(ourlist[i])) browser() container <- c(container, ourlist[i]) # container[i] <- ourlist[i] } } } return (container) } similars(numbers, container1) # [1] 10 32- 下一期:為什么
(次要。)在
if子句中,條件必須始終為 length-1。使用&&而不是&.if (ourlist[i] == ourlist[j] && !(ourlist[i] %in% container)){為什么?主要用于短路。
&并且|是矢量化的,這意味著它接受類似的東西c(TRUE,FALSE) | c(FALSE, TRUE),并且它總是迭代雙方的所有方面。&&只是單一的,但它會短路,如果第一個完美解決,那么第二個甚至不會嘗試評估。例子:TRUE || stop("oops") # [1] TRUE FALSE && stop("oops") # [1] FALSE TRUE && stop("oops") # Error: oops(次要。)
container這里似乎沒有必要通過。R 通過參考傳遞,所以它不像你在這里預分配記憶體。我建議你從引數串列中洗掉它,并在函式中預先定義它。similars <- function(ourlist) { container <- c() for (i in 1:(length(ourlist)-1)) { k <- i 1 for (j in k:length(ourlist)){ if (ourlist[i] == ourlist[j] && !(ourlist[i] %in% container)){ if (is.na(ourlist[i])) browser() container <- c(container, ourlist[i]) # container[i] <- ourlist[i] } } } return (container) }(更次要。)讓我們按照“允許 0 或更多”的計算機科學 (CS) 行來思考。從這個意義上說,傳遞一個空向量是否“合理”?如果將其作為引數給出,那么人們可能會期望回傳一個空向量。但是......
1:length(.)在這里不起作用。演示:vec <- 2:4 1:length(vec) # [1] 1 2 3 seq_along(vec) # [1] 1 2 3 seq_len(length(vec)) # [1] 1 2 3 vec <- c() 1:length(vec) # [1] 1 0 # this is broken seq_along(vec) # integer(0) seq_len(length(vec)) # integer(0)我建議您使用
seq_len(length(ourlist))(或length(.)-1),在此答案中制作最終版本:similars <- function(ourlist) { container <- c() for (i in seq_len(max(0, length(ourlist)-1))) { k <- i 1 for (j in (k-1) seq_len(max(0, length(ourlist)-(k-1)))) { if (ourlist[i] == ourlist[j] && !(ourlist[i] %in% container)){ if (is.na(ourlist[i])) browser() container <- c(container, ourlist[i]) # container[i] <- ourlist[i] } } } return (container) } similars(numbers)#, container1) # [1] 10 32 similars(c()) # NULL
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/419879.html
標籤:
上一篇:僅根據其他變數的觀察結果保留ID
