如何从 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])
}
}
大家好,我正在分析 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])
}
}