从数据集/变量中删除自定义(第二个)类

问题描述 投票:0回答:2

我一直在使用

hmisc
包中的一个名为
haven_labelled
的类(有时只是
labelled
)。其目的是从 Stata
.dta
数据集中导入列标签。当尝试在数据帧上使用
plm
时,我收到错误:

Error in as.data.frame.default(x[[i]], optional = TRUE) : 
  cannot coerce class ‘c("pseries", "haven_labelled")’ to a data.frame

课程如下:

> class(actualdataset)
[1] "pdata.frame" "data.frame"
> class(actualdataset$examplevar)
[1] "pseries"        "haven_labelled"

因此,我想从该数据库中删除

haven_labelled
类。遗憾的是我无法重现该错误。我认为这与我的
var
属于双重类别(其中包括有
actualdataset
)有关。请参阅以下示例数据集。

haven_labelled

有什么建议吗?

编辑:我在想以下事情:

library(data.table) library(plm) library(Hmisc) set.seed(1) DT <- data.table(panelID = sample(50,50), # Creates a panel ID Country = c(rep("A",30),rep("B",50), rep("C",20)), some_NA = sample(0:5, 6), some_NA_factor = sample(0:5, 6), Group = c(rep(1,20),rep(2,20),rep(3,20),rep(4,20),rep(5,20)), Time = rep(seq(as.Date("2010-01-03"), length=20, by="1 month") - 1,5), norm = round(runif(100)/10,2), Income = sample(100,100), Happiness = sample(10,10), Sex = round(rnorm(10,0.75,0.3),2), Age = round(rnorm(10,0.75,0.3),2), Educ = round(rnorm(10,0.75,0.3),2)) DT [, uniqueID := .I] # Creates a unique ID DT[DT == 0] <- NA # https://stackoverflow.com/questions/11036989/replace-all-0-values-to-na DT$some_NA_factor <- factor(DT$some_NA_factor) labels <- data.table::fread("Varcode Variables panelID a Country b Group c Time d norm e Income f Happiness g Sex h Age i Educ j uniqueID k ", header = TRUE) for (i in seq_len(ncol(DT))) { label(DT[[i]]) <- labels$Variables[match(names(DT)[i], labels$Varcode)] } DTp <- plm::pdata.frame(DT, index= c("panelID", "Time")) result <- plm(Happiness ~ Income, data=DTp, model="within") > class(DTp) [1] "pdata.frame" "data.frame" > class(DTp$Income) [1] "pseries" "labelled" "integer"

编辑2:答案可以防止应用时出现任何错误
for for (i in seq_len(ncol(DT)) { if (sapply(DT, function(x) class(x)[1L]) == "haven_labelled") { attr(DT[,i],"class[1L]") <- "integer" } }

。遗憾的是,所有

plm
coefficients
都为零。
standard errors
P-values
t-values
。我不确定是什么原因造成的。
    

r class plm hmisc
2个回答
1
投票
DTp

,根据您的原始数据集更改NA

labelled

labelled_ch



0
投票
for (i in seq_len(ncol(DTp))) { if (any(class(DTp[,i]) == "labelled")) { #browser() ind = which(class(DTp[,i])=="labelled") attr(DTp[,i],"class")[ind] <- "labelled_ch" } }

)。我在当前的 R 版本中总是遇到这样的错误:

avector

感谢您使用 
Can't convert `y` <double> to match type of `x` <avector>.

函数的想法。这是我的成果:

class()

这可以与 tidyverse 一起用于数据帧

simplify_classes = function(x, strip=c("avector")) { # We may handle single variables ... if ((length(class(x)) > 1) || (class(x) != "data.frame")) { class(x) = setdiff(class(x), strip) return(x) } # ... or a data.frames of multiple variables dfn = data.frame(row.names = row.names(x)) for (v in names(x)) { tmp = x[[v]] class(tmp) = setdiff(class(tmp), strip) dfn[[v]] = tmp } return(dfn) }

对于单个变量也是如此

my_data %>% select(!!items) %>% simplify_classes() %>% str()

希望这可以节省您一些时间。

© www.soinside.com 2019 - 2024. All rights reserved.