R: разные функции сообщают о разных размерах для одного и того же фрейма данных - PullRequest
0 голосов
/ 05 мая 2020

У меня есть фрейм данных, который я создал при чтении файла csv со следующими свойствами:

'data.frame':   1290 obs. of  9 variables:
 $ Date            : Factor w/ 1290 levels "1/3/2020 00:00",..: 97 98 99 100 101 102 103 104 105 106 ...
 $ Moisture.20.0   : num  39.8 40 40.1 40.1 40.2 ...
 $ Moisture.46.0   : num  40.9 40.9 40.9 40.9 40.9 ...
 $ Temperature.20.0: num  32.6 32.7 33 33.4 33.7 ...
 $ Temperature.46.0: num  32.3 31.9 31.9 31.8 31.8 ...
 $ EC.20.0         : num  0.302 0.303 0.305 0.309 0.313 ...
 $ EC.46.0         : num  0.511 0.507 0.507 0.507 0.507 ...
 $ Field.ID        : int  6466 6466 6466 6466 6466 6466 6466 6466 6466 6466 ...
 $ Sensor.loc      : Factor w/ 1 level "-00.0000000 00.0000000": 1 1 1 1 1 1 1 1 1 1 

Вы можете видеть, что он содержит 1290 строк для 9 переменных.

Однако, когда я перейти к определению, есть ли какие-либо значения NA в моем наборе данных, которые я получаю TRUE.

any(is.na(df))

[1] TRUE

Я точно знаю, что этот конкретный csv не имеет NA. Кроме того, я использую функцию which(), чтобы определить, где в моем фрейме данных я могу найти NA, но получаю странные результаты:

which(is.na(df))

[1] 1799 6959

Если я правильно понимаю, вызов возвращает два значения индекса, в которых я найду NAs: [1799,] и [6959,].

Я не понимаю, почему мне даны эти значения, если в моем исходном наборе данных только 1290 согласно вызову функции str().

Распознает ли функция which() размеры, отличные от str()? Могу ли я доверять which(is.na(df)) в предоставлении мне правильных индексов для проверки и работы с НП?

Ответы [ 2 ]

2 голосов
/ 05 мая 2020

Проблема в том, что 1799 - это не 1799-я строка , это 1799-й элемент по столбцам.

dat <- mtcars[1:4,]
dat[3,3] <- NA
dat
#                 mpg cyl disp  hp drat    wt  qsec vs am gear carb
# Mazda RX4      21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
# Mazda RX4 Wag  21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
# Datsun 710     22.8   4   NA  93 3.85 2.320 18.61  1  1    4    1
# Hornet 4 Drive 21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
which(is.na(dat))
# [1] 11

Эти 11 включают: 4 из столбец 1, 4 из столбца 2 и третий элемент в столбце 3. Если вы хотите провести вычисления, то

isna <- which(is.na(dat))
(isna - 1) %% nrow(dat) + 1
# [1] 3               # row of the NA
(isna - 1) %/% nrow(dat) + 1
# [1] 3               # column of the NA

ind2arr <- function(ind, nr) cbind((ind-1) %% nr + 1, (ind-1) %/% nr + 1)
ind2arr(which(is.na(dat)), nrow(dat))
#      [,1] [,2]
# [1,]    3    3

### demo
ind <- seq_len(prod(dim(dat)))
cbind(ind, ind2arr(ind, nrow(dat)))
#       ind     
#  [1,]   1 1  1
#  [2,]   2 2  1
#  [3,]   3 3  1
#  [4,]   4 4  1
#  [5,]   5 1  2
#  [6,]   6 2  2
#  [7,]   7 3  2
#  [8,]   8 4  2
# ...truncated...
# [41,]  41 1 11
# [42,]  42 2 11
# [43,]  43 3 11
# [44,]  44 4 11

Или лучше добавьте arr.ind=TRUE, чтобы получить лучшую перспективу.

which(is.na(dat), arr.ind = TRUE)
#            row col
# Datsun 710   3   3
1 голос
/ 05 мая 2020

Легко проверить, что происходит, с помощью простого макета

df <- data.frame(a = 1:3, b = c(1:2, NA))

is.na(df)
         a     b
[1,] FALSE FALSE
[2,] FALSE FALSE
[3,] FALSE  TRUE

which(is.na(df))
[1] 6

Итак, хотя у меня 3 строки, это шестой элемент df, то есть NA

Как указывает @ r2evans, вы можете найти виновных с помощью;

which(is.na(df), arr.ind = TRUE)
     row col
[1,]   3   2
...