根据其他变量创建新变量

时间:2018-10-31 10:17:18

标签: r dataframe categories

在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很陌生,因此我无法弄清楚。有关如何执行操作的任何建议?

5 个答案:

答案 0 :(得分:2)

鉴于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

答案 1 :(得分:0)

使用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

答案 2 :(得分:0)

如果您提供数据供我们使用,请使用dput()。

但是,也许使用dplyr这样的事情。

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

答案 3 :(得分:0)

使用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)))

答案 4 :(得分:0)

可能这样:

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