基于其他变量创建新变量

Create new variable based on other variables

在 R 中工作,我有一个包含三个变量的数据框,如下所示:

  var1        var2        var3       
1 0.695783133 0.009036145 0.02409639 
2 0.651006711 0.348993289 0.00000000 
3 1.000000000 0.000000000 0.00000000 
4 0.404185022 0.575991189 0.00000000 
5 0.004863813 0.736381323 0.25097276 
6 0.833827893 0.074183976 0.06231454 

我想添加第四个变量 (var4),其值将基于原始三个变量 (var1var2var3 的值) 通过以下方式:

如果var1 >= 0.5, var4 = 1

如果var2 >= 0.5, var4 = 2

如果var3 >= 0.5, var4 = 3

如果没有变量 >= 0.5,var4 = 4

例如像这样:

  var1        var2        var3       var4
1 0.695783133 0.009036145 0.02409639 1
2 0.651006711 0.348993289 0.00000000 1
3 1.000000000 0.000000000 0.00000000 1
4 0.404185022 0.575991189 0.00000000 2
5 0.004863813 0.736381323 0.25097276 2
6 0.833827893 0.074183976 0.06231454 1

我相信有一个简单的方法可以做到这一点,但我无法弄清楚,因为我是 R 的新手。关于如何操作有什么建议吗?

tidyverse:

library(tidyverse)
 df <- read.table(text=" var1        var2        var3       
            1 0.695783133 0.009036145 0.02409639 
            2 0.651006711 0.348993289 0.00000000 
            3 1.000000000 0.000000000 0.00000000 
            4 0.404185022 0.575991189 0.00000000 
            5 0.004863813 0.736381323 0.25097276 
            6 0.833827893 0.074183976 0.06231454 ")
 df%>%
   mutate(var4=case_when(
     var1>=.5 ~ 1,
     var2>=.5 ~ 2,
     var3>=.5 ~ 3,
     T~4))
         var1        var2       var3 var4
1 0.695783133 0.009036145 0.02409639    1
2 0.651006711 0.348993289 0.00000000    1
3 1.000000000 0.000000000 0.00000000    1
4 0.404185022 0.575991189 0.00000000    2
5 0.004863813 0.736381323 0.25097276    2
6 0.833827893 0.074183976 0.06231454    1

如果您提供数据供我们使用,使用 dput() 会有所帮助。

但是,使用 dplyr 可能会像这样。

df <- df %>% 
  mutate(var4 = case_when (var1 >= 0.5 ~ 1,
                           var2 >= 0.5 ~ 2,
                           var3 >= 0.5 ~ 3,
                           TRUE ~ 4)

使用 Base r ifelse 就可以了

df_test<- read.table(text= "var1        var2        var3       
1 0.695783133 0.009036145 0.02409639 
2 0.651006711 0.348993289 0.00000000 
3 1.000000000 0.000000000 0.00000000 
4 0.404185022 0.575991189 0.00000000 
5 0.004863813 0.736381323 0.25097276 
6 0.833827893 0.074183976 0.06231454 ",header = T)

df_test$var4 <- ifelse(df_test$var1 > 0.5,1,ifelse(df_test$var2 > 0.5,2,ifelse(df_test$var3 > 0.5,3,4)))

鉴于 var1 在第一个位置,var2 在第二个位置,依此类推,那么您可以使用 max.colifelse 来捕捉您的最后一个条件,即

ifelse(rowSums(df >= 0.5) == 0, 4, max.col(df >= 0.5))
#if 0.5 is the maximum value then ifelse(rowSums(df >= 0.5) == 0,4,max.col(df)) will also do
#1 2 3 4 5 6 
#1 1 1 2 2 1

可能是这样的:

sapply(apply(df >= .5, 1, which), function(x) if(length(x)) x[1] else 4)