删除R中多级列表中data.frames中列的属性

时间:2015-03-05 08:36:45

标签: r list

如何在R中的嵌套列表中删除以下data.frames列的属性?

List of 1
 $ 0021400001:List of 19
   $ GameSummary      :'data.frame':    1 obs. of  13 variables:
    $ GAME_DATE_EST                   : Factor w/ 1 level "2014-11-09T00:00:00": 1
      - attr(*, "names")= chr "1"
    $ GAME_SEQUENCE                   : Factor w/ 1 level "2": 1
      - attr(*, "names")= chr "2"
    $ GAME_ID                         : Factor w/ 1 level "0021400091": 1
      - attr(*, "names")= chr "3"
    $ GAME_STATUS_ID                  : Factor w/ 1 level "3": 1
      - attr(*, "names")= chr "4" 
   $ SeasonSeries     :'data.frame':    1 obs. of  7 variables:
     $ GAME_ID         : Factor w/ 1 level "0021400001": 1
      - attr(*, "names")= chr "1"
     $ HOME_TEAM_ID    : Factor w/ 1 level "1610612740": 1
      - attr(*, "names")= chr "2"
     $ VISITOR_TEAM_ID : Factor w/ 1 level "1610612753": 1
      - attr(*, "names")= chr "3"

7 个答案:

答案 0 :(得分:11)

这可能为时已晚,无法回答这个问题,但我想分享。

两种解决方案: 1.函数stripAttributes来自merTools包。

  1. 从数据框MyData中的变量VAR中删除属性ATT:

    Map {
      'product_key' => { shop: 'shop_key', distance: 1.2 },
      'product2_key' => { shop: 'shop2_key', distance: 0.1 } }
    [ { shop: 'shop2_key', distance: 0.1 },
      { shop: 'shop_key', distance: 1.2 } ]
    
  2. 如果要删除所有变量的多个属性:

    attr(MyData$VAR, "ATT") <- NULL
    

    我希望这有助于 此致

答案 1 :(得分:3)

对Parisa代码的微小修改对我有用:

for (var in colnames(MyData)) {
  attr(MyData[[deparse(as.name(var))]], "ATT_1") <- NULL
  attr(MyData[[deparse(as.name(var))]], "ATT_2") <- NULL
}

答案 2 :(得分:2)

您可以编写一个对列表中的一个条目起作用的函数,例如

one_entry <- function(x) {
    for (i in length(x)) attr(x[[i]], "names") <- NULL
    return(x)
}

然后运行lapply

lapply(my_list, FUN=one_entry)

其中mylist是问题中的数据结构。

答案 3 :(得分:2)

这是一个黑客,但在我的情况下工作。

lapply(my_list, FUN=function(x){data.frame(as.matrix(x),stringsAsFactors = F)})

答案 4 :(得分:0)

Karsten W.的回答对我有用,因为我必须删除2个以上的属性。略微修改为

my_list <- lapply(my_list, FUN=one_entry)

答案 5 :(得分:0)

在已经说过的所有内容的基础上,下面的代码将保留一些属性,并删除数据df中所有变量的其他属性。只需替换要保留在向量to_keep中的属性即可。在这种情况下,我假设我想保留属性“ label”和“ at1”-当然,假设它们存在。

to_keep <- c("label", "at1")

to_keep_regx <- paste(to_keep, collapse = "|")
  
nn  <- names(df)
for (x in seq_along(nn)) {
  
  ats       <- attributes(df[[x]])
  atsn      <- names(ats)
  to_remove <- atsn[!grepl(to_keep_regx, atsn)]
  
  for (i in seq_along(to_remove)) {
    attr(df[[x]], to_remove[i]) <- NULL
  }

}

最好

答案 6 :(得分:0)

在这种情况下,您可以使用 unname 来删除 names 仅与 lapply 结合使用:

dat[] <- lapply(dat, unname)

[] 用于确保结果仍然是 data.frame。您可以使用 c 删除几乎所有其他属性:

dat[] <- lapply(dat, c)

例如,考虑:

# setup data.frame to use
dat <- list(X1 = setNames(factor(1:3), letters[1:3]), 
            X2 = setNames(factor(4:6), LETTERS[1:3]))
attr(dat$X1, "xyz") <- "abc"
attr(dat$X2, "abc") <- "xyz"
dat <- as.data.frame(dat)

# remove attributes that are not names
dat[] <- lapply(dat, c) # use [] to preserve data.frame
str(dat) # no attributes. No names either but those are never added in R 3.6.3

# try with list instead
dat <- list(X1 = setNames(factor(1:3), letters[1:3]), 
            X2 = setNames(factor(4:6), LETTERS[1:3]))
attr(dat$X1, "xyz") <- "abc"
attr(dat$X2, "abc") <- "xyz"

# remove names
dat <- lapply(dat, unname) # no need for []
str(dat) # still has other attributes but not names

详情

来自help("c")

<块引用>

...除名称外的所有属性都被删除。

例外适用于因数和整数。请参阅手册页。