【问题标题】:remove columns with NAs from all dataframes in list从列表中的所有数据框中删除具有 NA 的列
【发布时间】:2012-08-03 14:23:23
【问题描述】:

我有一个由几个数据框组成的列表。我想删除每个数据框中所有带有 NA 的列。请注意,要删除的列在每个数据框中都不相同。下面提供的示例数据。任何建议都非常感谢。

WW1_Data <- structure(list(Alnön = structure(list(Site_Name = structure(1L, .Label =
c("Alnön","Ammarnäs", "Anjan", "Bäcksand", "Fittjebodarna", "Flatruet",
"Glen", "Idre", "Klångstavallen", "Kramfors", "Ljungdalen", "Ljungris",
"Mårdsund", "Mörtsjön", "Nordmaling", "Öster_Galåbodarna", "Ramundberget",
"Rätan", "Särvfjället", "Smedstorp", "Söderhamn", "Stensoffa",
"Storulvån", "Sveg", "Tanna", "Tänndalen", "Vålådalen", "Vemdalsskalet"
), class = "factor"), X1996 = 0.307692307692308, X1997 = NA_real_,
X2000 = 0.260869565217391, X2001 = NA_real_, X2002 = NA_real_,
X2003 = NA_real_, X2008 = NA_real_, X2009 = NA_real_, X2010 = 0.0833333333333333,
X2011 = NA_real_), .Names = c("Site_Name", "X1996", "X1997",
"X2000", "X2001", "X2002", "X2003", "X2008", "X2009", "X2010",
"X2011"), row.names = 1L, class = "data.frame"), Ammarnäs = structure(list(
Site_Name = structure(2L, .Label = c("Alnön", "Ammarnäs",
"Anjan", "Bäcksand", "Fittjebodarna", "Flatruet", "Glen",
"Idre", "Klångstavallen", "Kramfors", "Ljungdalen", "Ljungris",
"Mårdsund", "Mörtsjön", "Nordmaling", "Öster_Galåbodarna",
"Ramundberget", "Rätan", "Särvfjället", "Smedstorp", "Söderhamn",
"Stensoffa", "Storulvån", "Sveg", "Tanna", "Tänndalen", "Vålådalen",
"Vemdalsskalet"), class = "factor"), X1996 = 0.75, X1997 = NA_real_,
X2000 = NA_real_, X2001 = NA_real_, X2002 = NA_real_, X2003 = NA_real_,
X2008 = NA_real_, X2009 = NA_real_, X2010 = NA_real_, X2011 = 0.8), .Names =
c("Site_Name", "X1996", "X1997", "X2000", "X2001", "X2002", "X2003", "X2008",
"X2009", "X2010", "X2011"), row.names = 2L, class = "data.frame"),
Anjan = structure(list(Site_Name = structure(3L, .Label = c("Alnön",
"Ammarnäs", "Anjan", "Bäcksand", "Fittjebodarna", "Flatruet",
"Glen", "Idre", "Klångstavallen", "Kramfors", "Ljungdalen",
"Ljungris", "Mårdsund", "Mörtsjön", "Nordmaling", "Öster_Galåbodarna",
"Ramundberget", "Rätan", "Särvfjället", "Smedstorp", "Söderhamn",
"Stensoffa", "Storulvån", "Sveg", "Tanna", "Tänndalen", "Vålådalen",
"Vemdalsskalet"), class = "factor"), X1996 = NA_real_, X1997 = NA_real_,
X2000 = NA_real_, X2001 = NA_real_, X2002 = NA_real_,
X2003 = NA_real_, X2008 = NA_real_, X2009 = 0.52, X2010 = 0.5,
X2011 = NA_real_), .Names = c("Site_Name", "X1996", "X1997",
"X2000", "X2001", "X2002", "X2003", "X2008", "X2009", "X2010",
"X2011"), row.names = 3L, class = "data.frame"), Bäcksand = structure(list(
Site_Name = structure(4L, .Label = c("Alnön", "Ammarnäs",
"Anjan", "Bäcksand", "Fittjebodarna", "Flatruet", "Glen",
"Idre", "Klångstavallen", "Kramfors", "Ljungdalen", "Ljungris",
"Mårdsund", "Mörtsjön", "Nordmaling", "Öster_Galåbodarna",
"Ramundberget", "Rätan", "Särvfjället", "Smedstorp",
"Söderhamn", "Stensoffa", "Storulvån", "Sveg", "Tanna",
"Tänndalen", "Vålådalen", "Vemdalsskalet"), class = "factor"),
X1996 = NA_real_, X1997 = NA_real_, X2000 = 0.0833333333333333,
X2001 = NA_real_, X2002 = NA_real_, X2003 = NA_real_,
X2008 = NA_real_, X2009 = NA_real_, X2010 = 0.375, X2011 = NA_real_), .Names =   
c("Site_Name", "X1996", "X1997", "X2000", "X2001", "X2002", "X2003", "X2008",
"X2009", "X2010", "X2011"), row.names = 4L, class = "data.frame"),
Fittjebodarna = structure(list(Site_Name = structure(5L, .Label = c("Alnön",
"Ammarnäs", "Anjan", "Bäcksand", "Fittjebodarna", "Flatruet",
"Glen", "Idre", "Klångstavallen", "Kramfors", "Ljungdalen",
"Ljungris", "Mårdsund", "Mörtsjön", "Nordmaling", "Öster_Galåbodarna",
"Ramundberget", "Rätan", "Särvfjället", "Smedstorp", "Söderhamn",
"Stensoffa", "Storulvån", "Sveg", "Tanna", "Tänndalen", "Vålådalen",
"Vemdalsskalet"), class = "factor"), X1996 = NA_real_, X1997 = NA_real_,
X2000 = NA_real_, X2001 = NA_real_, X2002 = NA_real_,
X2003 = NA_real_, X2008 = 0.4, X2009 = 0.423076923076923,
X2010 = NA_real_, X2011 = NA_real_), .Names = c("Site_Name",
"X1996", "X1997", "X2000", "X2001", "X2002", "X2003", "X2008",
"X2009", "X2010", "X2011"), row.names = 5L, class = "data.frame")), .Names = c("Alnön",
"Ammarnäs", "Anjan", "Bäcksand", "Fittjebodarna"))

【问题讨论】:

    标签: r dataframe na


    【解决方案1】:

    试试这个

    lapply(WW1_Data, function(x) x[, !is.na(x)])
    $Alnön
      Site_Name     X1996     X2000      X2010
    1     Alnön 0.3076923 0.2608696 0.08333333
    
    $Ammarnäs
      Site_Name X1996 X2011
    2  Ammarnäs  0.75   0.8
    ...
    

    【讨论】:

    • 这非常有效。这很容易理解。谢谢!
    【解决方案2】:

    朱利叶斯的回答很好,但是我已经开始写了……

    您的问题有点模棱两可,但如果您想从列表中的每个 data.frame 中删除任何带有 NA 的行:

    lapply(WW1_Data, na.omit)
    

    或者您可以使用自己的函数,假设列表中的每个 data.frame 只有一行,如下所示:

    myfun <- function(x) {
      x[, !is.na(x)]
    }
    
    lapply(WW1_Data, myfun)
    

    或者切换到单个data.frame,将其融合并删除行:

    out <- do.call(rbind, WW1_Data)
    out.m <- melt(out, id.vars='Site_Name')
    na.omit(out.m)
    

    【讨论】:

      猜你喜欢
      • 2011-02-08
      • 2021-05-07
      • 1970-01-01
      • 1970-01-01
      • 2020-07-22
      • 1970-01-01
      • 1970-01-01
      • 2019-01-06
      相关资源
      最近更新 更多