在数据框列表中打印第N行

geo*_*ant 6 r lapply dataframe

我正在清理R中的几个excel文件.不幸的是,它们具有不等的尺寸,行和列.目前,我将每个Excel工作表存储为列表中的数据框.我知道如何通过发出以下命令打印列表中第一个数据帧的第4行:

df.list1[[1]][4,]
Run Code Online (Sandbox Code Playgroud)

或者像这样的一系列行:

df.list1[[1]][1:10,]
Run Code Online (Sandbox Code Playgroud)

我的问题是:如何为列表中的每个数据框打印特定行?换一种说法:

df.list1[[i]][4,]
Run Code Online (Sandbox Code Playgroud)

df.list1其中有30个数据框,但我的其他df.lists数据框超过140个,我希望提取它们的行.我希望能够将多个数据框中的特定位置存储到新列表中.我认为解决方案可能涉及lapply.

此外,有没有办法根据条件提取列表中每个数据框中的行?例如,对于列表df.list1中的所有30个数据帧,如果值等于"Apartment"或其他一些字符串,则提取行.

感谢您的帮助,如果我能帮助澄清我的问题,请告诉我.

the*_*ail 15

你也可以直接lapply提取函数@Justin建议,例如:

# example data of a list containing 10 data frames:
test <- replicate(10,data.frame(a=1:10),simplify=FALSE)

# extract the fourth row of each one - setting drop=FALSE means you get a
# data frame returned even if only one vector/column needs to be returned.
lapply(test,"[",4,,drop=FALSE)
Run Code Online (Sandbox Code Playgroud)

格式为:

lapply(listname,"[",rows.to.return,cols.to.return,drop=FALSE)

# the example returns the fourth row only from each data frame
#[[1]]
#  a
#4 4
# 
#[[2]]
#  a
#4 4
# etc...
Run Code Online (Sandbox Code Playgroud)

为了推广这个,当你完成了基于条件的提取,你必须一点点改变它的东西,如下面的例子中提取所有行a中的每个data.frame>4.在这种情况下,使用匿名函数可能是最清晰的方法,例如:

lapply(test, function(x) with(x,x[a>4,,drop=FALSE]) )

#[[1]]
#    a
#5   5
#6   6
#7   7
#8   8
#9   9
#10 10
# etc...
Run Code Online (Sandbox Code Playgroud)


Ric*_*rta 5

不需要包装器函数,只需在末尾使用lapply传递一个空白参数(表示列)

lapply(df.list, `[`, 4, )
Run Code Online (Sandbox Code Playgroud)

这也适用于您通常用于的任何类型的行参数,myDF[ . , ] 例如:lapply(df.list,[, c(2, 4:6), )

.


我建议如果你打算使用包装函数,让它更像[是这样的工作:例如

Grab(df.list, 2:3, 1:5)将选择每个data.frame的第二行和第三行以及第一列到第五列,并 Grab (df.list, 2:3)选择所有列的第二行和第三行

Grab <- function(ll, rows, cols) {
    if (missing(cols))
        lapply(ll, `[`, rows, )
    else 
        lapply(ll, `[`, rows, cols)
}

Grab (df.list, 2:3)
Run Code Online (Sandbox Code Playgroud)