1

我正在尝试根据同一 data.frame 的第三列(id)的值运行 data.frame 列与标量 A 和标量 B 的简单乘法。不知何故,我遇到了一些(订单,排序?)问题——到目前为止,结果肯定是错误的。这里有几个尝试:

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

我也尝试使用 %in% 语法,但也没有成功。我知道我可以使用 MySQL 并连接到 R,但在这种情况下,我只想在这里使用(基本)R 或 plyr。只是对于那些喜欢代码而不是我的 blabla 的人,这是我在 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 个 ID!

4

3 回答 3

5

假设您只有 123 或 124 in 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 multiplymeifelse如果您想对多个值使用不同的倍数,则可以将其扩展为语句链。

但是,正如下面的 mbq 评论,switch如果它开始变得笨拙,您可以使用一个语句:

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

不过,这可能会更慢,因为这将在ifelse矢量化时循环。

于 2010-07-19T11:46:37.607 回答
1

命令应该是:

subset(mydf,myid==123,multiplyme)

或者

mydf$multiplyme[mydf$myid==123]

等效的 SQL 命令是:

min(mydf$multiplyme[mydf$myid==123]*0.6)+min(mydf$multiplyme[mydf$myid==124]*0.4)

于 2010-07-19T11:34:22.187 回答
0

如果你真的有两个值myidthenifelse是一个简单的解决方案:

> 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重新排列行,因此您可能需要变量或行名称来识别观察结果。

于 2010-07-19T11:43:50.180 回答