2016-01-21 51 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