Как присвоить значение данным.кадр отфильтрован dplyr?

Я пытаюсь изменить данные.кадр отфильтрован dplyr, но я не совсем понимаю, что мне нужно сделать. В следующем примере я пытаюсь отфильтровать фрейм данных z, а затем назначить новое значение третьему столбцу-я даю два примера, один с "9" и один с "NA".

require(dplyr)
z <- data.frame(w = c("a", "a", "a", "b", "c"), x = 1:5, y = c("a", "b", "c", "d", "e"))
z %>% filter(w == "a" & x == 2) %>% select(y) 
z %>% filter(w == "a" & x == 2) %>% select(y) <- 9 # Should be similar to z[z$w == "a" & z$ x == 2, 3] <- 9
z %>% filter(w == "a" & x == 3) %>% select(y) <- NA # Should be similar to z[z$w == "a" & z$ x == 3, 3] <- NA

но это не работает: я получаю следующее сообщение об ошибке:

"ошибка в z % > % фильтр (w = =" a " & x == 3) %>% select (y) %

Я знаю, что могу использовать старые данные.фреймовая нотация, но каким будет решение для dplyr?

спасибо!

2 ответов


фильтрация будет подмножеством фрейма данных. Если вы хотите сохранить весь фрейм данных, но изменить его часть, вы можете, например, использовать mutate С ifelse. Я добавил stringsAsFactors=FALSE к вашим данным по образца так, что y будет столбцом символов.

z <- data.frame(w = c("a", "a", "a", "b", "c"), x = 1:5, y = c("a", "b", "c", "d", "e"), 
                stringsAsFactors=FALSE)

z %>% mutate(y = ifelse(w=="a" & x==2, 9, y))
  w x y
1 a 1 a
2 a 2 9
3 a 3 c
4 b 4 d
5 c 5 e

или replace:

z %>% mutate(y = replace(y, w=="a" & x==2, 9),
             y = replace(y, w=="a" & x==3, NA)) 
  w x    y
1 a 1    a
2 a 2    9
3 a 3 <NA>
4 b 4    d
5 c 5    e

у меня сложилось впечатление, что пакет dplyr философски настроен против изменения ваших базовых данных. Вы можете найти данные.пакет таблицы friendlier для этой операции:

library(data.table)
z <- data.table(w = c("a", "a", "a", "b", "c"), x = 1:5, y = c("a", "b", "c", "d", "e"))
m <- data.table(w = c("a","a"), x = c(2,3), new_y = c("9", NA))

z[m, y := new_y, on=c("w","x")]


   w x  y
1: a 1  a
2: a 2  9
3: a 3 NA
4: b 4  d
5: c 5  e

Я уверен, что есть способ и в базе R, но я этого не знаю. В частности, я не могу получить merge или match для выполнения работы.