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

时间:2015-01-21 06:46:27

标签: r na

大家好我正在分析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

但它不起作用。

请帮忙。

3 个答案:

答案 0 :(得分:8)

以下是在所有列中将" ?"替换为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用于将census中位置idx替换为NA

请注意,此处使用了函数is.na<-。它与is.na函数不同。

答案 1 :(得分:2)

看看gsub

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

编辑:忘记添加fixed = TRUE

正如理查德所指出的那样,这将会发生一切?

答案 2 :(得分:0)

无论出于何种原因,当我将此数据集导入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])
    }
}