R: Как l oop или laply по строкам в одном df и использовать информацию в другом df - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть df с тест-кейсами (например, если X = 1 и Y = 0, тогда cat = '3'), и дополнительный фрейм данных со значениями для тестирования

df <- data.frame('tc' = c('X==1 & Y!=1 ','X==0 & Y!=1','X==1 & Y==1'), "cat" = 1:3)
Data <- data.frame(X = c('1','0', '1','1', '1'), Y = c('1','0', '1','0', '1'))

В настоящее время я могу тестировать только для одного теста в то время, используя

#first testcase
Data <- within(Data, cat_test <- ifelse((X==1 & Y!=1 ), paste(df$cat[1]), 0))
table(Data$cat_test )

#second testcase
Data <- within(Data, cat_test <- ifelse((X==0 & Y!=1 ), paste(df$cat[2]), Data$cat_test))
table(Data$cat_test )

#...and so on...

Я хотел бы использовать lapply или аналогично l oop на фрейме данных и тестировать каждый тестовый пример, что-то вроде

Data <- within(Data, test <- ifelse(paste(df$tc), paste(df$cat), Data$test))

Is это возможно?

Ответы [ 2 ]

1 голос
/ 24 апреля 2020

Создайте строку, содержащую код для вычисления категории, а затем проанализируйте и оцените ее. Мы предполагаем, что условия являются взаимоисключающими (что имеет место в вопросе) и что значение по умолчанию, если ни одно из условий не является ИСТИНОЙ, равно 0 (но таких случаев в вопросе нет). Пакеты не используются.

txt <- with(df, paste( sprintf("%d*(%s)", cat, tc), collapse = "+"))
transform(Data, cat = eval(parse(text = txt)))

, что дает:

  X Y cat
1 1 1   3
2 0 0   2
3 1 1   3
4 1 0   1
5 1 1   3

Обратите внимание, что txt:

> txt
[1] "1*(X==1 & Y!=1 )+2*(X==0 & Y!=1)+3*(X==1 & Y==1)"

Если условия не являются взаимоисключающими и первое, что является правдивым, должно быть сообщено, используйте это как txt. Если ни один из них не является ИСТИННЫМ, он использует NA в качестве категории.

txt <- with(df, sprintf("c(%s)[max.col(cbind(%s,1) == 1, 'first')]",
  toString(cat), toString(tc)))
0 голосов
/ 24 апреля 2020

Вы можете сделать это так:

library(dplyr)
Data %>%
  mutate(cat = case_when(X == 1 & Y != 1 ~ 1,
                         X == 0 & Y != 1 ~ 2,
                         X == 1 & Y == 1 ~ 3))

Результат:

  X Y cat
1 1 1   3
2 0 0   2
3 1 1   3
4 1 0   1
5 1 1   3
...