1

我有一个数据集,其中包含家庭 ID('id')和家庭拥有的车辆的燃油经济性('mpg')。这是长格式,只有两列“id”和“mpg”。

我正在尝试使用 aggregate() 函数或 ddply() 将以下函数应用于数据:

logratio <- function(data=x, mpg=mpg)
{
    if (length(data[mpg])>1) {
        ratio <- log(max(data[mpg])/min(data[mpg]))
        return(ratio)
    }
    else return(0)
}

我尝试了以下方法:

mpgdf <- aggregate(mpg~id, FUN=logratio, data=mpgdata)

df <- ddply(mpgdata,~id,logratio)

都不工作。

这里的关键是我的理论宽格式将是一个“id”列,每个 id 一行,然后是每辆车的 mpg 列,直到最大车辆数(即,如果拥有最多车辆的房子有三个车辆,'mpg1,'mpg2','mpg3')。我想找到最高燃油经济性与最低燃油经济性之比的自然对数,如果只有一辆车,则返回 0(1 的对数)。

我开始有点沮丧,因为 plyr 和 reshape 似乎都想将列设置为现存的“mpg”列的值,而我希望它们如上所述。

我希望将其作为具有两列的数据框返回 - 每个家庭 ID 的“id”针对“mpglogratio”设置一次,以便我可以将其合并回我拥有的更大数据集。

帮助将不胜感激!

谢谢。

4

1 回答 1

1

plyr你可以试试这个

logratio <- function(x)
        log(max(x)/min(x))

require(plyr)
mtcars <- mtcars[,c("cyl", "mpg")]
mtcars <- rbind(mtcars, c(5, 30))

ddply(mtcars, .(cyl), summarise, mpglogratio = logratio(mpg))
##   cyl mpglogratio
## 1   4     0.46002
## 2   5     0.00000
## 3   6     0.18419
## 4   8     0.61310

只需将其替换cyl为您的实际数据以使其idmtcars您的数据一起使用,实际上无需测试长度,因为如果您的 mpg 长度为 1,那么max == minmax/min == 1最终将得到log(1)也称为0

最后一点,如果您想快速将其合并回来,请使用transform而不是summarise像这样

ddply(mtcars, .(cyl), transform, mpglogratio = logratio(mpg))
于 2013-07-23T17:42:34.810 回答