6

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

df.list1[[1]][4,]

或者像这样的一系列行:

df.list1[[1]][1:10,]

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

df.list1[[i]][4,]

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

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

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

4

4 回答 4

16

您也可以直接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)

格式为:

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...

当您根据条件完成提取时,为了概括这一点,您必须将其稍微更改为类似于以下示例的内容,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...
于 2013-08-04T01:39:04.067 回答
5

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

lapply(df.list, `[`, 4, )

这也适用于您通常使用的任何类型的行参数,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)
于 2013-08-04T04:44:23.583 回答
4

我的建议是编写一个函数,在单个数据帧上执行您想要的操作:

myfun <- function(dat) {
  return(dat[4, , drop=FALSE])
}

如果您想以向量而不是 的形式返回data.frame,只需执行以下操作:return(dat[4, ])insteaad. 然后使用lapply将该函数应用于列表的每个元素:

lapply(df.list1, myfun)

使用该技术,您可以轻松地想出方法来扩展myfun到更复杂的功能......

于 2013-08-04T01:19:55.430 回答
0

例如,您有一个名为 hw1_data.csv 的 .csv 文件,并且您想要检索第 47 行。以下是如何做到这一点:

x<-read.csv("hw1_data.csv")

x[47,]

如果是文本文件,您可以使用read.table.

于 2015-05-16T16:41:37.817 回答