【问题标题】:Recoding multiple adjacent columns so that 1=1, otherwise=0重新编码多个相邻列,使 1=1,否则=0
【发布时间】:2022-01-03 21:55:22
【问题描述】:

在重新编码 19 个连续变量(列)以使 1=1 否则 =0(即任何其他值变为零)的简单任务中运气不佳。 19 个变量是 s40b.1:s40b.19。这是我尝试过的...

df %>% 
mutate_at(vars(c(s40b.1:s40b.19), function(x) {
    case_when(
      x ==1 ~ 1,
      x != 1 ~ 0)
  })

【问题讨论】:

  • mutate_at 已被取代,请使用mutate(across(.., ..))。我认为df %>% mutate(across(s40b.1:s40b.19, ~ +(. == 1))) 应该可以工作,但如果没有样本数据,我无法真正验证它。
  • 如果您需要更具体的帮助,那么我认为您需要使这个问题可重现,包括样本数据和给定样本数据的预期输出。

标签: r dplyr case


【解决方案1】:

如果您想要基本的 R 方法,您应该可以使用 lapply() - 因为我没有您的确切数据,所以我制作了一些示例数据,但不确定它是否与您所拥有的大致相同。

## Create sample data
sample_data <- data.frame(id = sample(LETTERS, 50, replace = TRUE),
                          c1 <- sample(1:10, 50, replace = TRUE),
                          c2 <- sample(1:10, 50, replace = TRUE),
                          c3 <- sample(1:10, 50, replace = TRUE),
                          c4 <- sample(1:10, 50, replace = TRUE),
                          c5 <- sample(1:10, 50, replace = TRUE),
                          c6 <- sample(1:10, 50, replace = TRUE),
                          c7 <- sample(1:10, 50, replace = TRUE),
                          c8 <- sample(1:10, 50, replace = TRUE),
                          c9 <- sample(1:10, 50, replace = TRUE),
                          c10 <- sample(1:10, 50, replace = TRUE),
                          c11 <- sample(1:10, 50, replace = TRUE),
                          c12 <- sample(1:10, 50, replace = TRUE),
                          c13 <- sample(1:10, 50, replace = TRUE),
                          c14 <- sample(1:10, 50, replace = TRUE),
                          c15 <- sample(1:10, 50, replace = TRUE),
                          c16 <- sample(1:10, 50, replace = TRUE),
                          c17 <- sample(1:10, 50, replace = TRUE),
                          c18 <- sample(1:10, 50, replace = TRUE),
                          c19 <- sample(1:10, 50, replace = TRUE))
cols <- sprintf("s40b.%s",seq(1:19))
names(sample_data)[2:20] <- cols

使用lapply() 将列 s40b.1 转换为 s40b.19:

cols <- sprintf("s40b.%s",seq(1:19))

sample_data[cols] <- lapply(sample_data[cols], function(x){ifelse(x != 1, 0, 1)})

【讨论】:

    【解决方案2】:

    也许是这样的......

    
    
    df_new<-df %>%
      mutate(across(contains("s40b"), ~if_else(.x==1, 1, 0)))
    

    【讨论】:

    • 此方法将转换整个数据框中不等于 0 的所有内容,包括超出所需范围的列(例如,研究或位置 ID 编号/字符)
    • 抱歉,错过了。查看上面的修改
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    • 2017-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-03
    • 2019-12-23
    相关资源
    最近更新 更多