2017-05-21 207 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 

请让我知道这是否是你想要的