代码之家  ›  专栏  ›  技术社区  ›  abenol

用R中的新值重新编码多列中的多个值

  •  0
  • abenol  · 技术社区  · 3 年前

    我有18列的数据框架。第2列到第13列包括数值,如0、1、2、4。。。我想根据范围将它们重新编码为三类:

    if columns 2:13 are 0 -> 0
    if columns 2:13 between 1 & 5 -> 1
    else columns 2:13 >- 2.
    

    我的尝试奏效了,但效率不高:

    df[,2:13][df[,2:13] == 1 | df[,2:13] == 2 | df[,2:13] == 3 | df[,2:13] == 4 | df[,2:13] == 5] <- 1
    

    我感谢你的帮助。

    1 回复  |  直到 3 年前
        1
  •  1
  •   r2evans    3 年前

    尝试 findInterval :

    dplyr

    library(dplyr)
    df %>%
      mutate(
        across(2:13, ~ findInterval(., c(0, 1, 5), rightmost.closed = TRUE) - 1L)
      )
    

    如果这变得更加复杂(例如非连续的重新编码值),我们可能会切换到 case_when :

    df %>%
      mutate(
        across(2:13, ~ case_when(
          . == 0           ~ 0L,
          between(., 1, 5) ~ 1L,
          TRUE             ~ 2L
        ))
      )
    

    基数R

    df[,2:13] <- lapply(df[,2:13], function(z) findInterval(z, c(0, 1, 5), rightmost.closed = TRUE) - 1L)