我有一个名为“scebase”的列表,其中包含40个数据帧,每个数据帧为326行乘68列。我想使用lapply()对数据帧进行子集化,因此它们只保留行33-152。我写了一个名为trim()的简单函数(下面),并尝试将其应用于数据框列表但收到错误消息。该函数和我尝试使用lapply如下:
trim< - function(i) {(i< - i [33:152,])}
lapply(情景,修剪)
i [33:152,]中的错误:维数不正确
当我尝试对列表中包含的单个数据框(soil11base.txt)执行相同操作时(如下所示),它按预期工作:
soil11base.txt< - soil11base.txt [33:152,]
知道我需要做些什么才能使尺寸正确吗?
答案 0 :(得分:1)
你有2个解决方案。你可以
(a)分配到新列表newList = lapply(scenbase, function(x) { x[33:152,,drop=F]} )
(b)使用<<-
运算符将您的裁剪数据分配到位lapply(1:length(scenbase), function(x) { scenbase[[x]] <<- scenbase[[x]][33:152,,drop=F]} )
。
您的通话无效,因为i
不在全球范围内。您可以通过调用<<-
运算符来解决这个问题,该运算符分配给它在连续父环境中找到的第一个变量。或者通过创建一个新的修剪列表。
以下是一些复制解决方案(a)的代码:
listOfDfs = list()
for(i in 1:10) { listOfDfs[[i]] = data.frame("x"=sample(letters,200,replace=T),"y"=sample(letters,200,replace=T)) }
choppedList = lapply(listOfDfs, function(x) { x[33:152,,drop=F]} )
以下是一些复制解决方案(b)的代码:
listOfDfs = list()
for(i in 1:10) { listOfDfs[[i]] = data.frame("x"=sample(letters,200,replace=T),"y"=sample(letters,200,replace=T)) }
lapply(1:length(listOfDfs), function(x) { listOfDfs[[x]] <<- listOfDfs[[x]][33:152,,drop=F]} )