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

时间:2013-08-04 01:15:08

标签: r dataframe lapply

我正在清理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 个答案:

答案 0 :(得分: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)

格式为:

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

要在基于条件完成提取时对此进行概括,您必须将其更改为类似下面的示例,提取每个adata.frame>4的所有行{1}}。在这种情况下,使用anonymous function可能是最明确的方法,例如:

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

答案 1 :(得分:5)

不需要包装器功能,只需使用lapply 在末尾传递空白参数 (代表列)

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

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

<小时/>

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

Grab(df.list, 2:3, 1:5)会选择第二个&amp;每个data.frame和第三行和第一列到第5列 Grab (df.list, 2:3)会选择第二个&amp;所有列的第三行

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

Grab (df.list, 2:3)

答案 2 :(得分:4)

我的建议是编写一个在单个数据框上执行所需操作的函数:

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

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

lapply(df.list1, myfun)

通过这种技术,您可以轻松找到将myfun扩展到更复杂功能的方法......

答案 3 :(得分:0)

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

<table>
    <thead>
        {% for field in form %}
            <th>{{ field.label }}</th>
        {% endfor %}
    </thead>
    <tbody>
        <tr>
            {% for field in form %}
                <td>{{ field.value|default_if_none:'' }}</td>
            {% endfor %}
        </tr>
    </tbody>
</table>

如果是文本文件,您可以使用x<-read.csv("hw1_data.csv") x[47,]