繁体   English   中英

R:如何对列表中的所有数据帧进行子集化?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM