[英]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=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
,僅返回每行中少於4個NA
的那些。
如果要從文件中讀取數據,請使用下面的read.table選項:
read.table(...,quote="")
如果您有條件地創建了NA,例如:
df[condition] <- NA
確保你從不使用引用(“NA”)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.