dplyr更新data.frame中的单元格

时间:2016-01-21 02:48:54

标签: r dplyr

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

假设我要修改最后一行

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

如何将此行更新为data.frame? 唯一的办法,我找到了一个奇怪的方法就是做一个 反加入并追加结果。

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

然而,这似乎是一种非常不优雅的方式来完成一项简单的任务。 任何想法都非常感谢...

2 个答案:

答案 0 :(得分: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 :(得分:2)

如果你坚持dplyr,也许

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