【问题标题】:Mutate multiple columns with a certain condition in R在R中用特定条件改变多个列
【发布时间】:2018-01-01 10:37:33
【问题描述】:

我有这个数据

M1  M2  M3 UCL
1   2   3   1.5

我想在这个条件下创建新列:

如果 M1 大于 UCL,则 MM1 将为“UP”,否则为“NULL”

如果 M2 大于 UCL,则 MM2 将为“UP”,否则为“NULL”

如果 M3 大于 UCL,则 MM3 将为“UP”,否则为“NULL”

M1  M2  M3 UCL   | MM1  MM2 MM3
1   2   3   1.5  | NULL UP  UP

但我有几个 M 列(如 M1~M1005),所以我想做一些代码,如 mutate_each 和 mutate_at。如何使用 mutate 和 ifelse 函数在特定条件下创建新列?

【问题讨论】:

标签: r if-statement dplyr conditional-statements multiple-columns


【解决方案1】:

这是一个简单的dplyr 解决方案。请注意,为新变量添加后缀更容易,例如得到M1_M 而不是MM1。但是,如果您想重命名它们,您可以在之后设置 colnames(参见例如 here 了解如何操作)。

我将结果显示为tibble,以便您查看列类型。请注意,一旦新列中同时包含UPNA,它将从逻辑类型变为字符类型。

library(dplyr)

textdata <- "M1  M2  M3 UCL
1   2   3   1.5"

mydf <- read.table(text = textdata, header = T)

mydf %>% 
    mutate_at(vars(starts_with("M")), funs(M = ifelse(. > UCL, "UP", NA))) %>% 
    tibble::as.tibble()

# A tibble: 1 x 7
     M1    M2    M3   UCL  M1_M  M2_M  M3_M
  <dbl> <dbl> <dbl> <dbl> <lgl> <chr> <chr>
1     1     2     3   1.5    NA    UP    UP

【讨论】:

  • 似乎不需要mutate_if(is.integer, as.numeric) %&gt;%。请确认?
  • 感谢@RickPack,已相应更新了答案。
【解决方案2】:

使用基础 R:

dt <- read.table(text="M1  M2  M3 UCL
1   2   3   1.5",header=T)

ncols <- ncol(dt)
dt <- cbind(dt, ifelse(subset(df, select=M1:M3) > dt[,"UCL"], "UP", "NULL"))
colnames(dt)[ncols:ncol(dt)] = paste0("M", colnames(dt)[ncols:ncol(dt)])

结果:

   M1 M2 M3  UCL  MM1 MM2 MM3
1   1  2  3  1.5 NULL  UP  UP

【讨论】:

  • 你能编辑你的答案,所以 MUCL 是 OP 中的 UCL 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-14
  • 2020-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-05
  • 2023-01-15
相关资源
最近更新 更多