2017-07-26 70 views
2

我有这样的数据变异多列具有一定条件中的R

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

+0

也许你可以看看这个帖子https://www.enchufa2.es/archives/programming-with-dplyr -by-using-dplyr.html查看如何使用字符串来选择列(但我不知道它是否可行) – AntoineBic

回答

2

这是一个简单的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_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 
0

随着基础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 MUCL MM1 MM2 MM3 
1 1 2 3 1.5 NULL UP UP 
相关问题