使用lapply来对数据帧中的行进行子集化 - 错误的维度数量错误

时间:2014-01-21 01:45:03

标签: r lapply subset

我有一个名为“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,]

知道我需要做些什么才能使尺寸正确吗?

1 个答案:

答案 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]} )