如何从 R 中的数据集中删除问号(?)

how do I remove question mark(?) from a data set in R

大家好,我正在分析 UCI 成人 census 数据。数据中每个缺失值都有问号 (?)。

我想把所有的问号都换成NA

我试过了:

library(XML)
census<-read.csv("https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data",header=F,na.strings="?")
names(census)<-c("Age","Workclass","Fnlwght","Education","EducationNum","MaritalStatus","Occupation"   
  ,"Relationship" , "Race","Gender","CapitalGain","CapitalLoss","HoursPerWeek","NativeCountry","Salary"  )

table(census$Workclass)

                ?       Federal-gov         Local-gov      Never-worked           Private      Self-emp-inc 
             1836               960              2093                 7             22696              1116 
 Self-emp-not-inc         State-gov       Without-pay 
             2541              1298                14 

x

<-ifelse(census$Workclass=="?",NA,census$Workclass)
 table(x)
x
    1     2     3     4     5     6     7     8     9 
 1836   960  2093     7 22696  1116  2541  1298    14

但是没用。

请帮忙。

看看 gsub

census$x <- gsub("?",NA,census$x, fixed = TRUE)

编辑:忘记添加 fixed = TRUE

正如 Richard 指出的那样,这将捕获所有出现的 ?

这里有一个简单的方法可以将所有列中的 " ?" 替换为 NA

# find elements
idx <- census == " ?"
# replace elements with NA
is.na(census) <- idx

如何运作?

命令idx <- census == " ?"创建一个逻辑矩阵,其行数和列数与数据框census相同。此矩阵 idx 包含 TRUE,其中 census 在其他位置包含 " ?"FALSE

矩阵idx用作索引。命令is.na(census) <- idx用于在idx中的位置用NA替换census中的值。

注意这里使用了函数is.na<-。它与 is.na 函数不同。

出于某种原因,当我将此数据集导入 R 时,问号被读入为整数。

这是我将所有问号编码为 N/A 的方法。我确信有更好的方法可以做到这一点,但我的 R 技能不是最好的,这对我有用。

col_names:

names <- list(
    'age','workclass','fnlwgt',
    'education','education-num',
    'marital-status','occupation',
    'relationship','race','sex',
    'capital-gain','capital-loss',
    'hours-per-week','native-country', 'salary'
)

代码:

# Save csv as variable adult
adult <- read.csv("~/.../adult.data", col.names = names)

for(i in 1:length(adult)) {
    matches <- grepl("\?", adult[ ,i])
    for(j in 1:length(matches)) {
        ifelse(matches[j] == TRUE, adult[j,i] <- "NA", matches[j])
    }
}