2017-05-21 111 views
0

完整的初學者與R和我環顧四周相當多,但我找不到我需要的東西。如果循環內循環遍歷R中的列表?

我有一個for循環遍歷值的列表。我想提出的,如果循環內的循環,像這樣:

for (i in list){ 
    if (i>200){ 
     print (i) 
     } 
    } 

這將返回以下警告:

「的警告信息: 在IF(I> 200){: 條件有長度> 1,只有第一個元素將被使用「

並且肯定,if循環只檢查列表中第一個元素的條件。

我知道這可能是因爲for循環不會在R中返回任何東西,但是解決方法是什麼。我該如何解決這個問題?

感謝您的幫助。

+1

你能提供什麼你在'list'?警告基本上告訴你,如果'i'具有比1長的向量,那麼只有第一個元素會被使用。這基本上意味着'list'的結構有問題。你可以很容易地使用'l < - list(1:2); (i> l)if(i> 200)print(i)' –

+0

將'str(list)'的輸出添加到你的問題中應該會有所幫助。 – Marius

回答

0
for (i in 1:20){ 
    if (i>10) print(i) 
    } 

一般而言,條件是真或假:1或0,所以條件必須始終有長度爲1

+0

我不明白我做錯了什麼。對於我來說,if語句只是比較列表中的第一個條目。如果第一個條目> 200,則整個列表打印,否則不顯示。 – doddy

+0

問題是我們不知道'list'中是什麼。如果'list'是一個向量列表,比'i'是一個向量,'i> 200'將返回一個警告消息,因爲您正在比較向量與單個數字。 – xraynaud

+0

For循環運行索引。您使用索引來抓取對象中的每個元素。如果你想看看列表中的第一個元素,那麼你將它子集。 'if(list [[1]] [1]> 200)print(list [[1]])' –

0

你提的問題不夠詳細,正是你想做的事知道。

一般來說,apply家庭是非常有用的與載體的工作:看到?apply

文檔如果從要僅保留> 200向量的那些元素的數字載體列表那麼你可以使用下面的代碼:

# list of numeric vectors 
my_list <- list(a = c(201, 199, 202), 
       b = c(9, 203, 188), 
       c = c(203, 210, 7)) 


# using the apply family to e.g. calculate a mean 
sapply(my_list, mean) 
#  a  b  c 
# 200.6667 133.3333 140.0000 

# same thing but now with explicitely naming the vector i 
# using an anonymous function 
sapply(my_list, function(i) mean(i)) 
#  a  b  c 
# 200.6667 133.3333 140.0000 

# using a anonymous function to select in the vector what we want 
sapply(my_list, function(i){ i[i>200] }) 
# $a 
# [1] 201 202 
# 
# $b 
# [1] 203 
# 
# $c 
# [1] 203 210 

請讓我知道這是否是你想要的