Создать новую переменную на основе других переменных - PullRequest
0 голосов
/ 31 октября 2018

Работая в 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), значение которой будет основано на значении исходных трех переменных (var1, var2, var3) следующим образом:

Если 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 голосов
/ 31 октября 2018

Возможно вот так:

sapply(apply(df >= .5, 1, which), function(x) if(length(x)) x[1] else 4)
0 голосов
/ 31 октября 2018

Учитывая, что var1 находится в первой позиции, var2 во второй и т. Д., Вы можете использовать max.col вместе с ifelse, чтобы перехватить ваше последнее условие, т.е.

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
0 голосов
/ 31 октября 2018

Было бы полезно, если бы вы предоставили нам данные для работы, используйте dput ().

Но, возможно, что-то подобное с использованием dplyr.

df <- df %>% 
  mutate(var4 = case_when (var1 >= 0.5 ~ 1,
                           var2 >= 0.5 ~ 2,
                           var3 >= 0.5 ~ 3,
                           TRUE ~ 4)
0 голосов
/ 31 октября 2018

Использование 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)))
0 голосов
/ 31 октября 2018

С 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
...