簡體   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