Разные результаты grep () и "==" - PullRequest
0 голосов
/ 02 ноября 2019

У меня есть следующий фиктивный элемент data.frame:

setseed(666)
df<-data.frame(ID=rep(c("A","B","C"),each=11),Year=rep(2010:2020,each=1,3),x1=floor(runif(33,0,10)),x2=floor(runif(33,0,2)),
                   x3=floor(runif(33,1,100)),x4=floor(runif(33,1,100)),x5=floor(runif(33,1,100)))

Я хотел бы знать, сколько NA - либо в виде строки "NA", либо в качестве пропущенного значения NA, содержащегося в data.frame. Для тестирования я запускаю следующие строки:

print(length(grep("\\<NA\\>", df)))
print(length(which(is.na(df))))
print(length(which(df=="NA")))

Представляем NA как пропущенные значения:

df1.na$x1[rbinom(33,1,0.1)==1]<-"NA"
df1.na$x2[rbinom(33,1,0.1)==1]<-NA
df1.na$x3[rbinom(33,1,0.1)==1]<-NA
df1.na$x4[rbinom(33,1,0.1)==1]<-NA
df1.na$x5[rbinom(33,1,0.1)==1]<-NA

Результаты тех же строк, что и выше, отличаются от 2 до 5. Is.na () отлично работает для пропущенных значений. Но совпадение строк, кажется, отключено, как вы можете видеть ниже:

print(length(grep("\\<NA\\>", df)))
print(length(which(is.na(df))))
print(length(which(df=="NA")))

Я ожидаю, что grep () и "==" вернут один и тот же ответ при поиске строки "NA",но они сильно различаются, и я не знаю почему. И какой из них лучше? Я заметил, что для больших data.frames (2.000.000x 30) grep () занимает очень много времени. Есть более быстрые варианты?

Спасибо. А.Лот!

1 Ответ

1 голос
/ 02 ноября 2019

В дополнение к тому, что медленнее, print(length(grep("\\<NA\\>", df))) не дает желаемого результата. Он дает не количество совпадающих ячеек, а количество столбцов, которые при преобразовании в тип: символ соответствуют \<NA\>.

Так что

print(length(which(df=="NA")))

определенно лучше.

Еще один вариант: преобразовать символьные столбцы в числовые, затем использовать только is.na:

df$x1 = as.numeric(df$x1)
print(length(which(is.na(df))))
...