2016-01-21 78 views
2
df <-data.frame(x=c(1:5),y=c(letters[1:5])) 

比方說,我想修改的最後一排,dplyr更新在data.frame細胞

update.row<-filter(df,x==5) %>% mutate(y="R") 

如何更新此行到data.frame? 唯一的辦法,我發現雖然一個奇怪的方法是做一個反連接並追加結果。

df <-anti_join(df,update.row,by="x") %>% 
    bind_rows(update.row) 

但是,它似乎是一個非常簡單的任務的方式。 任何想法,非常感謝...

+2

'DF <- df %>%發生變異(Y =取代(as.character(Y)中,x == 5, 「R」))' – Jota

+6

'df $ y [df $ x == 5] < - 「R」'並且完成它。 – thelatemail

+0

這是通過@Jota,'df%>%mutate(y = ifelse(x == 5,'R',as.character(y)))''解決方案的一個小選擇。 'as.character'在這裏是需要的,因爲'y'是一個因素。 – steveb

回答

2

data.table,我們可以分配(:=)的值,其中i是TRUE。這是非常有效的,因爲分配工作已經完成。

library(data.table) 
setDT(df)[x==5, y:="R"] 
df 
# x y 
#1: 1 a 
#2: 2 b 
#3: 3 c 
#4: 4 d 
#5: 5 R 

由於對最後一行中提到的OP,一個更普遍的方式是

setDT(df)[.N, y:= "R"] 

或者像@thelatemail提到的,如果我們要替換的任何行剛剛提到在i即行索引這種情況下5

setDT(df)[5, y:="R"] 
1

如果你在dplyr insistant,也許

df <-data.frame(x=c(1:5),y=c(letters[1:5])) 

library(dplyr) 
df %>% 
    mutate(y = as.character(y)) %>% 
    mutate(y = ifelse(row_number()==n(), "R", y)) 

# x y 
#1 1 a 
#2 2 b 
#3 3 c 
#4 4 d 
#5 5 R