我正在尝试修改特定范围内行的列值。这是我的数据:
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))
感谢您的任何建议。
答案 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