如何在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"
答案 0 :(得分:11)
这可能为时已晚,无法回答这个问题,但我想分享。
两种解决方案: 1.函数stripAttributes来自merTools包。
从数据框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 } ]
如果要删除所有变量的多个属性:
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")
:
...除名称外的所有属性都被删除。
例外适用于因数和整数。请参阅手册页。