R dplyr:改变特定行范围的列

时间:2015-12-14 03:11:09

标签: r dplyr

我正在尝试修改特定范围内行的列值。这是我的数据:

df = data.frame(names = c("george","michael","lena","tony"))

我希望使用dplyr执行以下操作:

df[2:3,] = "elsa"

我的尝试如下,但它似乎不起作用:

df = cbind(df, rows = as.integer(rownames(df)))
dplyr::mutate(df, ifelse(rows %in% c(2,3), names = "elsa" , names = names))

给出了结果:

Error: unused arguments (names = "elsa", names = c(1, 3, 2, 4))

感谢您的任何建议。

4 个答案:

答案 0 :(得分:3)

这个问题有点模糊,但我认为OP试图用索引来替换数据框中的某些值。正如上面的评论所指出的那样,示例数据框的列由一个因子变量组成,这使得替换值的行为与您预期的不同。有两种方法可以解决这个问题。

第一种(更详细)的方法是强制df$names成为字符变量而不是因子。然后使用索引选择您想要更改和替换它的值:

df$names = as.character(df$names)
df$names[c(2,3)] = "elsa"

或者,您可以设置stringsAsFactors = TRUE并按上述步骤操作。

df = data.frame(names = c("george","michael","lena","tony"), stringsAsFactors = FALSE)
df$names[c(2:3)] = "elsa"

   names
1 george
2   elsa
3   elsa
4   tony

绝对查看?data.frame以获得更全面的解释。

答案 1 :(得分:2)

因子答案更快,但您可以使用dplyr这样做(请注意,列必须属于character而不是factor ):

df <- data.frame(names = c("george","michael","lena","tony"), stringsAsFactors=F)
oldnames <- c("michael", "lena")
df <- mutate(df, names=ifelse(names %in% oldnames, "elsa", names))

另一种方法是做一些像

这样的事情
oldnames <- c("michael", "lena")
df$names[df$names %in% oldnames] <- "elsa"

答案 2 :(得分:2)

明确地将names转换为字符向量并使用replace

df %>% mutate(names = replace(as.character(names), 2:3, "elsa"))

注意:如果names已经是一个字符向量,我们就可以做到:

df %>% mutate(names = replace(names, 2:3, "elsa"))

答案 3 :(得分:0)

我们可以使用data.table执行此操作。将'data.frame'转换为'data.table'(setDT(df)),将行索引指定为i并将(:=)'elisa'指定给'names'。正如OP提到的关于大型数据集的那样,使用来自:=的{​​{1}}将非常快。

data.table