ГДЕ эквивалентен в R, умножение условно на другой столбец того же df - PullRequest
1 голос
/ 19 июля 2010

Я пытаюсь запустить простое умножение столбца data.frame со скаляром A и скаляром B соответственно на основе значения третьего столбца (id) того же data.frame.Почему-то у меня возникла проблема (порядок, сортировка?) - пока результат определенно неверный.Вот несколько попыток:

mydf$result = subset(mydf,myid==123,multiplyme)*0.6 +
subset(mydf,myid==124,,multiplyme)*0.4

Я также пытался использовать% в синтаксисе%, но также не увенчался успехом.Я знаю, что мог бы, например, MySQL и подключиться к R, но в этом случае я просто хочу использовать (базовый) R или plyr, по крайней мере, здесь.Просто для тех из вас, кто предпочитает код моему бла-блу, вот как я это сделаю в SQL:

SELECT
MIN(CASE WHEN myid=123 THEN multiplyme*0.6 END)
MIN(CASE WHEN myid=124 THEN multiplyme*0.4 END)
FROM mytable
GROUP BY result;

Спасибо за любые предложения по помощи / R-кодам заранее!Обратите внимание, что у меня более 2 идентификаторов!

Ответы [ 3 ]

5 голосов
/ 19 июля 2010

Если у вас есть только 123 или 124 в myid:

mydf$result <- mydf$multiplyme * ifelse(mydf$myid==123,0.6,0.4)

Если в myid есть другие переменные, добавьте дополнительные ifelse и регистр по умолчанию.

РЕДАКТИРОВАТЬ:

Поскольку у вас есть дополнительные переменные в myid, я констатирую расширение.

mydf$result <- mydf$multiplyme * ifelse(mydf$myid==123,0.6,ifelse(mydf$myid==124,0.4,0))

Вы можете изменить 0 в конце на1, если в случае по умолчанию вы хотите сохранить значение multiplyme.Это может быть расширено до цепочки операторов ifelse, если вы хотите использовать разные кратные значения для многих значений.

Однако, как указано ниже в комментариях mbq, вы можете использовать оператор switch, если он начинает получатьunwieldy:

mydf$result <- mydf$multiplyme * sapply(mydf$myid,function(x) switch(as.character(x),"123"=0.6,"124"=0.4))

Это, вероятно, будет медленнее, поскольку это будет цикл, пока ifelse векторизовано.

1 голос
/ 19 июля 2010

Команда должна быть:

subset(mydf,myid==123,multiplyme)

или

mydf$multiplyme[mydf$myid==123]

Эквивалентная команда SQL:

мин (mydf $ multiplyme [mydf $ MyID == 123] * 0,6) + мин (mydf $ multiplyme [mydf $ MyID == 124] * 0,4)

0 голосов
/ 19 июля 2010

Если у вас действительно есть два значения myid, тогда ifelse - простое решение:

> mydf<-data.frame(multiplyme=c(1,2,3,4),myid=c(123,124,124,123))
> with(mydf,multiplyme*ifelse(myid==123,0.6,0.4))
[1] 0.6 0.8 1.2 2.4

Для небольшого числа возможных значений myid вы можете использовать вложенные вызовы на ifelse. Но merge обеспечивает более чистую опцию, если myid может принимать много возможных значений:

> multdf<-data.frame(myid=c(123,124),m=c(0.6,0.4))
> mydf<-merge(mydf,multdf)
> mydf
  myid multiplyme   m
1  123          1 0.6
2  123          4 0.6
3  124          2 0.4
4  124          3 0.4
> with(mydf,multiplyme*m)
[1] 0.6 2.4 0.8 1.2

Обратите внимание, что merge переставляет строки, поэтому вы можете захотеть иметь переменные или имена строк для идентификации наблюдений.

...