[英]R: How do you subset all data-frames within a list?
我有一个称为WaFramesCosts
的数据帧列表。 我只想将其子集以显示特定的列,以便随后将其导出。 我努力了:
for (i in names(WaFramesCosts)) {
WaFramesCosts[[i]][,c("Cost_Center","Domestic_Anytime_Min_Used","Department",
"Domestic_Anytime_Min_Used")]
}
但它返回错误
Error in `[.data.frame`(WaFramesCosts[[i]], , c("Cost_Center", "Department", :
undefined columns selected
我也尝试过:
for (i in seq_along(WaFramesCosts)){
WaFramesCosts[[i]][ , -which(names(WaFramesCosts[[i]]) %in% c("Cost_Center","Domestic_Anytime_Min_Used","Department",
"Domestic_Anytime_Min_Used"))]
但我得到同样的错误。 谁能看到我在做什么错?
旁注:作为参考,我使用了这个:
for (i in seq_along(WaFramesCosts)) {
t <- WaFramesCosts[[i]][ , grepl( "Domestic" , names( WaFramesCosts[[i]] ) )]
q <- subset(WaFramesCosts[[i]], select = c("Cost_Center","Domestic_Anytime_Min_Used","Department","Domestic_Anytime_Min_Used"))
WaFramesCosts[[i]] <- merge(q,t)
}
同时尝试使用不同的方法实现相同的目标,并且似乎越来越接近。
欢迎回来,Kootseeahknee。 您仍然错误地认为for
循环的最后一个命令在末尾隐式返回。 如果你想要的行为,也许你想lapply
:
myoutput <- lapply(names(WaFramesCosts)), function(i) {
WaFramesCosts[[i]][,c("Cost_Center","Domestic_Anytime_Min_Used","Department","Domestic_Anytime_Min_Used")]
})
undefined columns selected
错误告诉我,您对数据集的假设不正确:至少一个缺少列中的至少一列。 从上一个问题( 如何对列表中的所有数据帧的列进行复杂的编辑? ),我推断出您想要匹配的列,而不是假设它包含在所有内容中。 由此,您可以/应该使用grep
或某些变体:
myoutput <- lapply(names(WaFramesCosts)), function(i) {
WaFramesCosts[[i]][,grep("(Cost_Center|Domestic_Anytime_Min_Used|Department)",
colnames(WaFramesCosts)),drop=FALSE]
})
这将匹配包含任何这些字符串的列名。 通过使用正则表达式确保整个字符串或开始/结束匹配可以使您更加精确。 例如,从(Cost|Dom)
(包含“ Cost”或“ Dom”的任何内容)更改为(^Cost|Dom)
意味着任何以“ Cost” 开头或包含 “ Dom”的内容; 同样, (Cost|ment$)
匹配包含“ Cost”或以“ ment” 结尾的任何内容。 但是,如果您始终想要完全匹配,而只需要存在的匹配项,那么类似的方法将起作用:
myoutput <- lapply(names(WaFramesCosts)), function(i) {
WaFramesCosts[[i]][,intersect(c("Cost_Center","Domestic_Anytime_Min_Used","Department"),
colnames(WaFramesCosts)),drop=FALSE]
})
请注意,在最后一个示例中:注意mtcars[,2]
(返回向量)和mtcars[,2,drop=FALSE]
(返回1列的data.frame
)之间的data.frame
。 防御性编程,如果您认为过滤完全有可能返回单列,请通过在括号中添加,drop=FALSE
来确保您不会无意间将其转换为vector
。
根据您的描述,这是一个使用库dplyr来为给定的一组列组合数据帧列表的示例。 并不需要所有数据框都具有相同的列(在可重现的示例中提供数据会更好)
# test data
df1 = read.table(text = "
c1 c2 c3
a 1 101
b 2 102
", header = TRUE, stringsAsFactors = FALSE)
df2 = read.table(text = "
c1 c2 c3
w 11 201
x 12 202
", header = TRUE, stringsAsFactors = FALSE)
# dfs is a list of data frames
dfs <- list(df1, df2)
# use dplyr::bind_rows
library(dplyr)
cols <- c("c1", "c3")
result <- bind_rows(dfs)[cols]
result
# c1 c3
# 1 a 101
# 2 b 102
# 3 w 201
# 4 x 202
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.