在R中突变具有特定条件的多个列

时间:2017-07-26 08:23:27

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

我有这个数据

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函数来在特定条件下创建新列?

2 个答案:

答案 0 :(得分:4)

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

我将结果显示为UP,以便您可以看到列类型。请注意,一旦新列中同时包含NAlibrary(dplyr) textdata <- "M1 M2 M3 UCL 1 2 3 1.5" mydf <- read.table(text = textdata, header = T) mydf %>% mutate_if(is.integer, as.numeric) %>% 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 ,它就会从逻辑类型更改为字符类型。

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)])

答案 1 :(得分:0)

以基地R:

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

结果:

Office 365 accounts