подмножество вектора / фрейма данных в R дает разные результаты - PullRequest
0 голосов
/ 12 февраля 2019

Недавно меня спросили о подмножестве фрейма данных в R. У моего коллеги была эта строка кода

dd2 <- subset(dd, tret == c("T1", "T2", "T3", "T4")), что дает 1/4 от подмножества.В отличие от стандартного dd2 <- subset(dd, tret == "T1" | tret == "T2" | tret == "T3" | tret == "T4"), который дает 960 строк, первая строка кода дает только 240 строк.

То же самое происходит с векторами.Например,

x <- c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4)
y <- x[x == 1 | x == 2] gives a vector different from 
y <- x[x == c(1,2)] 

Есть понимание различий?Спасибо.

1 Ответ

0 голосов
/ 12 февраля 2019

Проблема заключается в повторном использовании значений, когда мы используем vector с length больше 1, а другой - length> 1.

x == 1:2
#[1]  TRUE FALSE  TRUE FALSE FALSE  TRUE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

, где

x
#[1] 1 1 1 1 2 2 2 2 3 3 3 3 4 4 4 4

и сравнение выполняется следующим образом

rep(1:2, length.out = length(x))
#[1] 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2

В приведенном выше примере 1 сравнивается с первым элементом x, 2 с 2-м элементом, 1 снова с 3-м элементом x, 2с 4-м, и это повторяется до конца вектора «х».Для сравнения векторов длины> 1 используйте %in%

identical(x[x == 1 | x == 2], x[x %in% 1:2])
#[1] TRUE
...