首页 文章

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

提问于
浏览
2

我有一个名为“scebase”的列表,其中包含40个数据帧,每个数据帧为326行乘68列 . 我想使用lapply()对数据帧进行子集化,因此它们只保留行33-152 . 我写了一个名为trim()的简单函数(下面),并尝试将其应用于数据框列表但收到错误消息 . 该函数和我尝试使用lapply如下:

trim < - function(i){(i < - i [33:152,])} lapply(scebase,trim)i [33:152,]中的错误:维数不正确

当我尝试对列表中包含的单个数据框(soil11base.txt)执行相同的操作时(如下所示),它按预期工作:

soil11base.txt < - soil11base.txt [33:152,]

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

1 回答

  • 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]} )
    

相关问题