как использовать рекурсивную оценку вектора условий на другом векторе ifelse - PullRequest
0 голосов
/ 17 июня 2019

Проблема в применении условий if в строках и столбцах 2 разных фреймов данных.

Данные

df1<- data.frame(X1=10,
                 X2=12,
                 X3= 8,
                 X4=4,
                 X5=6)

df2<-data.frame(Class = c("class_1", "class_2","class_3", "class_4", "class_5", "class_6",
                "class_7", "class_8", "class_9", "class_10"),
                MARKS = c(8,6,9,10,11,8,5,4,7,5))

Выход :

class 1     Y       Y   FALSE   FALSE   FALSE
class 2     Y       Y   Y       FALSE   FALSE
class 3     Y       Y   FALSE   FALSE   FALSE
class 4     FALSE   Y   FALSE   FALSE   FALSE
class 5     FALSE   Y   FALSE   FALSE   FALSE
class 6     Y       Y   FALSE   FALSE   FALSE
class 7     Y       Y   Y       FALSE   Y
class 8     Y       Y   Y       FALSE   Y
class 9     Y       Y   Y       FALSE   FALSE
class 10    Y       Y   Y       FALSE   Y

formula: =IF($A$2>$I2,"Y")
FOR CLASS 1 - I2 WILL BE CONSTANT 

Например: где A2 = 10 df1 и I2 = 8 df2. Если 10> 8, выведите Y, иначе условие не выполнится и выведите FALSE.

FOR CLASS 2 - I3 WILL BE CONSTANT 
FORMULA =IF($A$2>$I3,"Y")

Аналогично, где B2 = 12 OF DF1 и I3 = 6 OF df2, поэтому, если 12> 6, выведите Y, иначе условие не выполнится и выведите FALSE.

Ответы [ 2 ]

2 голосов
/ 17 июня 2019

Вы можете сделать это следующим образом, используя ifelse() рекурсивно:

> Res<-apply(df1,2,function(x){ifelse((x<=df2$MARKS), "FALSE", "Y")})
> rownames(Res)<- df2$Class      
> Res
         X1      X2  X3      X4      X5     
class_1  "Y"     "Y" "FALSE" "FALSE" "FALSE"
class_2  "Y"     "Y" "Y"     "FALSE" "FALSE"
class_3  "Y"     "Y" "FALSE" "FALSE" "FALSE"
class_4  "FALSE" "Y" "FALSE" "FALSE" "FALSE"
class_5  "FALSE" "Y" "FALSE" "FALSE" "FALSE"
class_6  "Y"     "Y" "FALSE" "FALSE" "FALSE"
class_7  "Y"     "Y" "Y"     "FALSE" "Y"    
class_8  "Y"     "Y" "Y"     "FALSE" "Y"    
class_9  "Y"     "Y" "Y"     "FALSE" "FALSE"
class_10 "Y"     "Y" "Y"     "FALSE" "Y"    
0 голосов
/ 17 июня 2019

Вы можете использовать комбо dplyr и base R. Сначала я делаю df1 той же длины, что и df2, и связываю их вместе столбцом. Затем я применяю формулу к каждому столбцу, в имени которого есть буква X:

library(dplyr)

df2 %>% 
  bind_cols(df1[rep(seq_len(nrow(df1)), each=nrow(df2)),]) %>% 
  mutate_at(vars(contains("X")), ~if_else(. <= MARKS, "FALSE", "Y"))

Результат:

      Class MARKS    X1 X2    X3    X4    X5
1   class_1     8     Y  Y FALSE FALSE FALSE
2   class_2     6     Y  Y     Y FALSE FALSE
3   class_3     9     Y  Y FALSE FALSE FALSE
4   class_4    10 FALSE  Y FALSE FALSE FALSE
5   class_5    11 FALSE  Y FALSE FALSE FALSE
6   class_6     8     Y  Y FALSE FALSE FALSE
7   class_7     5     Y  Y     Y FALSE     Y
8   class_8     4     Y  Y     Y FALSE     Y
9   class_9     7     Y  Y     Y FALSE FALSE
10 class_10     5     Y  Y     Y FALSE     Y
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...