我是R的新手。坚持做作业:
我的代码是:
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循环有问题,谢谢!
答案 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部分,那么这里有一些帮助。 lst2
是lst
的子集,只有大于50的值。直观的举措是运行lst > 50
或lst[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)