【问题标题】:Replace values with subseting operator [用子集运算符 [ 替换值
【发布时间】:2020-01-17 08:21:16
【问题描述】:

我有以下数据:

set.seed(1)

df_1 <- data.frame(x = replicate(n = 2, expr = sample(x = 1:3, size = 20, replace = T)), 
               y = as.factor(sample(x = 1:5, size = 20, replace = TRUE)))

我想在x.1x.2 simultaneoulsy 中用9 替换数字&gt;=2

df_1[df_1$x.1, df_1$x.2 >= 2] <- 9

[&lt;-.data.frame(*tmp*, df_1$x.1, df_1$x.2 >= 2, value = 9) 中的错误: 列的重复下标

并将y中的99替换为3

df_1$y[df_1$y %in% c('3')] <- 99

警告信息: 在[&lt;-.factor(*tmp*, df_1$y %in% c("3"), value = c(2L, 5L, 2L, : 无效因子水平,NA生成

Tks.

【问题讨论】:

  • 你需要成为一个因素吗?有什么理由不能将它作为常规数值使用吗?

标签: r


【解决方案1】:

我们可以使用replace

df_1[1:2] <- replace(df_1[1:2], df_1[1:2] >=2, 9)

或者另一种选择是在“x”的子集上创建逻辑矩阵。列,提取值并将其分配给 9

df_1[1:2][df_1[1:2] >= 2] <- 9

要更改factor,我们要么需要再次调用factor,要么事先添加levels

levels(df_1$y) <- c(levels(df_1$y), "99")
df_1$y
#[1] 4 4 4 2 4 1 1 4 1 2 3 2 2 5 2 1 3 3 4 3
#Levels: 1 2 3 4 5 99

df_1$y[df_1$y == '3'] <- '99'
df_1$y
#[1] 4  4  4  2  4  1  1  4  1  2  99 2  2  5  2  1  99 99 4  99
@#Levels: 1 2 3 4 5 99

或者正如@thelatemail 提到的,如果我们在替换时删除了levels

levels(df_1$y)[levels(df_1$y) == '3'] <- "99"

或者可以使用forcats中的fct_recode

library(forcats)
df_1$y <- fct_recode(df_1$y, "99" = "3")

【讨论】:

  • 我需要[ 的解决方案。
  • 对于y 因素,[ 没有解决方案?
  • @neves for factor, levels 需要更新或再次致电factor。更新了帖子
  • 您也可以直接覆盖因子levels - levels(df_1$y)[levels(df_1$y) == 3] &lt;- "9"
猜你喜欢
  • 2011-05-08
  • 2012-09-14
  • 1970-01-01
  • 2015-02-25
  • 1970-01-01
  • 2017-07-02
  • 1970-01-01
  • 1970-01-01
  • 2013-09-18
相关资源
最近更新 更多