繁体   English   中英

删除R中的“NA”值(由于某种原因,na.omit和complete.cases仅适用于一个变量......)

[英]Removing “NA” values in R (for some reason na.omit and complete.cases only work on one variable…)

这项任务的第一部分是从外部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个观察结果。

问题是您的数据文件用引号括起所有值,如下所示:

"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 ...

为什么不减轻压力,而是阅读.txt版本的数据呢? 我在与.csv相同的页面上的数据列表中找到了它。 它没有像.csv文件那样异常间隔,并且没有摆弄read.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

使用as.is=TRUEna.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 ,仅返回每行中少于4个NA的那些。

如果要从文件中读取数据,请使用下面的read.table选项:

read.table(...,quote="")

如果您有条件地创建了NA,例如:

df[condition] <- NA

确保你从不使用引用(“NA”)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM