我正在清理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”或其他一些字符串,则提取该行。
感谢您的帮助,如果我能帮助澄清我的问题,请告诉我。
答案 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...
要在基于条件完成提取时对此进行概括,您必须将其更改为类似下面的示例,提取每个a
中data.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,]
。