поиск по фрейму данных == не найдены все условия - PullRequest
0 голосов
/ 07 мая 2018

Я пытаюсь условно заменить некоторые поля в кадре данных;тем не менее, мой код находит около 25% фактических присутствующих экземпляров.Я искал другие вопросы условного поиска, но не нашел ничего соответствующего моей проблеме - заранее прошу прощения, если пропустил один.

В частности, я пытаюсь заменить все числа от 1 до 9 в dta $ day на a to i.

Вот первые 100 элементов в этом векторе: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 1 2 34 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 2526 27 28 29 30 31 1 2 3 4 5 6 7 8 9

Когда я условно ищу значения от 1 до 9, используя:

dta$day == c("1","2","3","4","5","6","7","8","9")

В нем говорится, что только первый и последнийустановить в этой группе соответствие моего состояния, как показано ниже (я выделил жирным шрифтом ~ что должно быть ИСТИНА для вашей справки):

[1] **TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE** FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[17] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE **FALSE**
[33] **FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE** FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[49] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE **FALSE FALSE**
[65] **FALSE FALSE FALSE FALSE FALSE FALSE FALSE** FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[81] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  **TRUE  TRUE  TRUE  TRUE  TRUE  TRUE**
[97]  **TRUE  TRUE  TRUE**

Проблема должна быть на этом первом шаге, но чтобы показать вам результат, толькопервый и последний набор в этих первых 100 в моем векторе соответственно заменяются после применения этого кода:

dta[dta$day == c("1","2","3","4","5","6","7","8","9"),1
] <- c("a", "b", "c", "d", "e", "f", "g", "h", "i")

[1] **"a"  "b"  "c"  "d"  "e"  "f"  "g"  "h"  "i"**  "10" "11" "12" "13" "14" "15" "16" "17" "18" "19"
 [20] "20" "21" "22" "23" "24" "25" "26" "27" "28" "29" "30" "31" **"1"  "2"  "3"  "4"  "5"  "6"  "7"** 
 [39] "8"  "9"  "10" "11" "12" "13" "14" "15" "16" "17" "18" "19" "20" "21" "22" "23" "24" "25" "26"
 [58] "27" "28" **"1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10"** "11" "12" "13" "14" "15" "16" "17"
 [77] "18" "19" "20" "21" "22" "23" "24" "25" "26" "27" "28" "29" "30" "31" **"a"  "b"  "c"  "d"  "e" 
 [96] "f"  "g"  "h"  "i"**

Если это полезно, вот начальное состояние этого вектора:

is.numeric(dta$day)

[1] TRUE

summary(dta$day) 

Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
1.00    8.00   16.00   15.73   23.00   31.00

Я воспроизводю кадр данных здесь:

day <- c(1:31,1:28,1:31,1:30)
month <- c(rep_len(1,31),rep_len(2,28),rep_len(3,31),rep_len(4,30))
temp <- rnorm(length(month),10,10)
dta=as.data.frame(cbind(day,month,temp))

И на самом деле, хотя я могу воспроизвести проблему с этим примером игрушки, я получаю предупреждение, что яне соглашайтесь с моими фактическими данными (не воспроизводимыми здесь, потому что они очень большие): «длинная длина объекта не кратна короткой длине объекта».

Я хотел бы получить некоторую помощь, и если бы я этого не сделалпредоставьте что-нибудь или не сделали этого в необходимом формате, пожалуйста, дайте мне знать!

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Используйте %in% вместо == и затем индексируйте ваш фрейм / вектор данных, как показано ниже, чтобы заменить 1: 9 на a: i, как требуется:

y <- c(1:9)
dta$day[dta$day %in% y] <- letters[1:length(y)]

Подробнее о различном поведении этих операторов читайте здесь:

Разница между == и% в% операторов в R

И

Разница между `% in%` и `==`

0 голосов
/ 07 мая 2018

Похоже, вы проверяете эквивалентность на вектор, а не его компоненты. Попробуйте вместо этого %in%, вот так:

dta[dta$day %in% c("1","2","3","4","5","6","7","8","9"), ]
...