替换数据框中列中的特定值

时间:2019-01-24 14:01:51

标签: r replace

对于这个基本问题,我深表歉意,我花了20分钟的时间来弄清楚这个问题。示例:

x <- sample(c("1","2"), 100, replace = TRUE)
y <- sample(c("3","4"), 100, replace = TRUE)
xy <- cbind(x,y)

现在,我想将x列中的所有“ 2”替换为“ 0”。根据我的真实数据,我需要将所有编码为“ 2”的女性重新编码为“ 0”。

我尝试过:

xy$x[,xy$x == 2] <- 0

xy[xy$x== 2] <- 0

women <- xy$x== 2
xy[women,] <- 0

这些都不起作用。前两个给出错误,最后一个将整个行替换为零。我在该站点上进行了很多搜索,但是必须有一个非常简单的解决方案(无论如何也很难解决)。

编辑:

我很抱歉使用样本不等于我的实际问题。我如何用这个样品呢?

x <- sample(c("1","2"), 100, replace = TRUE)
y <- sample(c("3","4"), 100, replace = TRUE)
xy <- cbind(x,y)

谢谢!

1 个答案:

答案 0 :(得分:0)

有几个问题:

  • xy是矩阵,但是代码使用$表示数据帧。

  • 如果xy是一个数据帧,则xy$x是一维的,但是问题中的代码正尝试使用2个维度对其进行索引

  • 问题中使用women的代码正在尝试将整行设置为0

  • 为了使示例可重复,该问题应包含set.seed,以便每次调用它时都使用相同的随机数字

此代码在问题中的变体有效。请注意,使用stringsAsFactors=FALSE很重要,因为否则列x将是factor,而0则不是该因子的水平。

xy <- as.data.frame(xy, stringsAsFactors = FALSE)
xy$x[xy$x == 2] <- 0

对于涉及women的代码,再次假设xy是一个数据帧:

women <- xy$x== 2
xy[women, "x"] <- 0

如果xy是问题中的矩阵,则此方法有效:

xy[xy[, "x"] == 2, "x"] <- 0

无论xy是矩阵还是数据帧,它都有效,并返回一个data.frame:

transform(xy, x = replace(x, x == 2, 0))

transform(xy, x = ifelse(x == 2, 0, x))