2016-04-28 3 views
6

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

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 

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

«Ошибка в г%>% фильтра (ш == "а" & х == 3)% >% выберите (у) < - NA: невозможно де ла trouver fonction "%>% < -"

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

Спасибо!

+0

Ваш 'y' - столбец символов. Что вы назначаете ему '9'? – Frank

ответ

7

Фильтрация будет подмножать рамку данных. Если вы хотите сохранить весь фрейм данных, но измените его часть, вы можете, например, использовать 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 
+2

'replace' - аналогичный вариант, который цепочки красиво:' z%>% mutate (y = y%>% replace (w == "a" & x == 2, 9)%>% replace (w == " a «& x == 3, NA))' – Frank

+1

Я просто работал над этим, но вы избили меня! – eipi10

+0

Вы сохраните несколько символов путем цепочки вместо написания нескольких аргументов 'mutate' (нужно просто написать' y' дважды, я имею в виду, как и в моем комментарии), хотя это означает, что они строят трубы внутри труб. – Frank

6

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

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, чтобы выполнить эту работу.

+0

Спасибо! Это очень творческий подход к i [j] (я думаю) нотации. Спасибо за data.table: как и многие вещи в R, это выглядит настолько интуитивно, когда другие делают это, но так мало, когда нужно это понять ... И да, я согласен с вашим комментарием о философии dplyr. – nullepart

+0

@ user5 Да, мне очень нравится, как нотация 'X [Y]' для слияния двух data.tables имитирует нотацию 'X [Y]' для подмножества двух матриц в базе R. Я использую этот 'X [Y, v: = new_v] '' слияние-присваивать "синтаксис все время. Если вам интересно, вводные виньетки очень понятны: https://github.com/Rdatatable/data.table/wiki/Getting-started – Frank

Смежные вопросы