循环遍历R中的列表

时间:2015-06-19 01:53:13

标签: r for-loop

我是R的新手。坚持做作业:

  1. 为第一个组件列表[[1]]创建长度为10的列表 维数为1,第二个是1 * 2,第三个是3 * 3,第四个是 4 * 4,依此类推。应从1:100随机选择值。
  2. 对于列表中的每个组件,请选择值> 50并写一个 函数计算值= sd(值)/均值(值)时 长度(值)> 1,否则返回0.
  3. 我的代码是:

    v1 = c(runif(1,1,100))
    v2 = matrix(runif(2,1,100))
    v3 = matrix(runif(9,1,100),3,3)
    v4 = matrix(runif(16,1,100),4,4)
    li = list(v1,v2,v3,v4)
    for (i in li){
      if (li[[i]] >5){
        print (li[[i]])
      }
    }
    

    但似乎我的for循环有问题,谢谢!

1 个答案:

答案 0 :(得分:1)

以下是对第1部分的回答。对于R,通常有多种方法来完成相同的任务。当我第一次开始时,我迷路了。但是通过努力和挣扎,我学到了很多东西。

lst <- list()
for(i in 1:10) lst[[i]] <- sample(100,i^2)
lst

关于代码的一点点:在循环外部创建一个空列表。想想为什么它不能在里面。

我可以给计数器变量一个名字,我随意选择i。我们从整数1到100中挑选。第一次,我们选择1平方数。等于1。第二轮我们从1到100选择2个平方数字,即4,依此类推。

<强>更新

既然你有时间尝试第2部分,那么这里有一些帮助。 lst2lst的子集,只有大于50的值。直观的举措是运行lst > 50lst[lst > 50]。这些都是误导性的路线。使用lapply函数评估每个列表元素的功能。

lst2 <- lapply(lst, function(x) x[x>50])

接下来,我们使用问题中的约束创建一个函数。在这种情况下,函数ifelse快速简便。

f <- function(x) {
  ifelse(length(x) > 1, sd(x)/mean(x), 0)
}

最后,我们运行上面定义的函数。我们使用相同的lapply函数来完成任务。

lapply(lst2, f)

<强>摘要

整个作业可以通过以下方式完成:

lst <- list()
for(i in 1:10) lst[[i]] <- sample(100,i^2)
lst2 <- lapply(lst, function(x) x[x>50])
f <- function(x) ifelse(length(x) > 1, sd(x)/mean(x), 0) 
lapply(lst2, f)