此作业的第一部分是从外部http站点导入数据;数据包含8个变量,1,339个观测值。其中四个变量(年龄,身高,体重,igf1)中包含NA值(注意:其他变量也可能有NA值,但我并不关心它们)。我需要消除这四个变量中的NA值:这是我在努力的地方。
这是我到目前为止所做的:
#imports dataset from internet
importData <- read.table("http://people.sc.fsu.edu/~jburkardt/datasets/iswr/juul2.csv", sep=',', header=T)
#inspects the data:
str(importData)
基本上,我想删除年龄,身高,体重和igf1中的所有NA值。当我剩下858个观测值时,我会知道我很成功。
其中三个变量(高度,重量,igf1)包含FACTOR类型信息。其中一个变量(年龄)包含数字信息。我无法在它们之间成功实现complete.cases和/或na.omit:这些函数似乎只在$ age上工作,它们消除了5个NA值(但不触及其他变量)
我需要帮助删除剩余变量中的NA值。再说一次,当我完成后,我应该有858个观察结果。
答案 0 :(得分:6)
问题是您的数据文件用引号括起所有值,如下所示:
"age", "height", "menarche", "sex", "igf1", "tanner", "testvol", "weight"
"NA", "NA", "NA", "NA", "90.0", "NA", "NA", "NA"
"NA", "NA", "NA", "NA", "88.0", "NA", "NA", "NA"
当R读取它时,它将所有值作为字符串,默认情况下表示为因子。 NA
仅作为这些因素的一个级别的标签。您可以使用str
:
> str(importData)
'data.frame': 1339 obs. of 8 variables:
$ age : num NA NA NA NA NA 0.17 0.17 0.17 0.17 0.17 ...
$ height : Factor w/ 600 levels " 110.8"," 111.5",..: 600 600 600 600 600 600 600 600 600 600 ...
$ menarche: Factor w/ 3 levels " 1"," 2"," NA": 3 3 3 3 3 3 3 3 3 3 ...
$ sex : Factor w/ 3 levels " 1.00"," 2.00",..: 3 3 3 3 3 1 1 1 1 1 ...
$ igf1 : Factor w/ 501 levels " 100.0"," 101.0",..: 490 487 53 55 23 2 498 6 10 474 ...
$ tanner : Factor w/ 6 levels " 1"," 2"," 3",..: 6 6 6 6 6 1 1 1 1 1 ...
$ testvol : Factor w/ 26 levels " 1"," 10"," 11",..: 26 26 26 26 26 26 26 26 26 26 ...
$ weight : Factor w/ 518 levels " 14.1"," 17.9",..: 518 518 518 518 518 518 518 518 518 518 ...
因此,在不制作因素的情况下读取您的数据,这些因素全部为数字:
> importData <- read.csv("http://people.sc.fsu.edu/~jburkardt/datasets/iswr/juul2.csv",
stringsAsFactors=F, na.strings=c(NA,"NA"," NA"))
> str(importData)
'data.frame': 1339 obs. of 8 variables:
$ age : num NA NA NA NA NA 0.17 0.17 0.17 0.17 0.17 ...
$ height : num NA NA NA NA NA NA NA NA NA NA ...
$ menarche: int NA NA NA NA NA NA NA NA NA NA ...
$ sex : num NA NA NA NA NA 1 1 1 1 1 ...
$ igf1 : num 90 88 164 166 131 101 97 106 111 79 ...
$ tanner : int NA NA NA NA NA 1 1 1 1 1 ...
$ testvol : int NA NA NA NA NA NA NA NA NA NA ...
$ weight : num NA NA NA NA NA NA NA NA NA NA ...
现在删除NA
s:
> data <- importData[complete.cases(importData[c("age","height","weight","igf1")]),]
> str(data)
'data.frame': 858 obs. of 8 variables:
$ age : num 6 6.08 6.26 6.4 6.42 6.43 6.61 6.63 6.7 6.72 ...
$ height : num 112 117 120 116 116 ...
$ menarche: int NA NA NA NA NA NA NA NA NA NA ...
$ sex : num 1 1 1 1 1 1 1 1 1 1 ...
$ igf1 : num 98 242 196 179 126 142 236 148 174 136 ...
$ tanner : int 1 1 1 1 1 1 1 1 1 1 ...
$ testvol : int 1 1 1 1 1 1 1 2 1 1 ...
$ weight : num 19.1 21.7 24.7 19.6 20.6 20.2 28 21.6 26.1 22.6 ...
答案 1 :(得分:6)
为什么不减轻压力并阅读.txt
版本的数据呢?我在与.csv
相同的页面上的数据列表中找到了它。它不像.csv
文件那样异常间隔,并且没有摆弄read.csv
个参数(我在找到另一个文件之前做了很长时间)。
con <- "http://people.sc.fsu.edu/~jburkardt/datasets/iswr/juul2.txt"
dat <- read.table(con, header = TRUE)
sapply(dat, class)
# age height menarche sex igf1 tanner testvol weight
# "numeric" "numeric" "integer" "numeric" "numeric" "integer" "integer" "numeric"
cols <- c("age", "height", "weight", "igf1")
resultSet <- dat[complete.cases(dat[cols]), ]
dim(resultSet)
# [1] 858 8
答案 2 :(得分:3)
使用as.is=TRUE
和na.strings = c(NA, "NA", " NA"))
读取您的数据。您的文件在字段之间有空格,这些空格被解释为字段的一部分。
data <- read.table("http://people.sc.fsu.edu/~jburkardt/datasets/iswr/juul2.csv",
sep=",", header=TRUE, as.is=TRUE, na.strings=c(NA, "NA", " NA"))
如果要删除所选所选列的行NA
,请使用complete.cases
:
new.data <- data[complete.cases(data[ ,c("age", "height", "weight", "igf1")]), ]
nrow(new.data)
# [1] 858
如果您只想删除所选列所有的行NA
,请使用rowSums
:
new.data <- data[rowSums(is.na(data[ ,c("age", "height", "weight", "igf1")])) < 4, ]
nrow(new.data)
# [1] 1339 # there aren't any such rows :)
这隔离了四列,测试它们是否为NA
,并且对于每一行计算了NA
的数量,仅返回每个列中NA
个少于{{1}}的那些行。
答案 3 :(得分:0)
如果要从文件中读取数据,请在下面使用read.table选项:
read.table(...,quote="")
如果您有条件地创建了NA,例如:
df[condition] <- NA
确保不要使用引号(“ NA”)。