我试图找出钻石数据集中每个克拉因子水平的最高价格:
diamonds[,'carat']<-factor(diamonds[,'carat'])
df<-with(diamonds, tapply(diamonds$price, diamonds$carat, max))
输出是仅两列的数据框。我希望我的df包含数据集中的所有其他列。另外,我希望该表保留列的名称。现在df中的两行是'行名'和'x'。感谢。
答案 0 :(得分:6)
如果您需要在现有数据集中创建新列
,可以尝试ave
library(ggplot2)
data(diamonds)
diamonds$Max <- with(diamonds,ave(price, carat,FUN= max))
或者,如果您需要每个'carat'组的max
值为'price'的行
library(dplyr)
res1 <- diamonds %>%
group_by(carat) %>%
slice(which.max(price))
或者
library(data.table)
res2 <- as.data.table(diamonds)[,.SD[which.max(price)] , carat]
或者
library(sqldf)
nm1 <- setdiff(names(diamonds), 'price')
nm1[6] <- paste0("[",(nm1[6]),"]")
res3 <- sqldf(sprintf('select %s,
max(price) as price
from diamonds
group by carat',
toString(nm1)))
或使用base R
res4 <- do.call(rbind,lapply(split(diamonds, diamonds$carat),
function(x) x[which.max(x$price),]))
如果我们需要所有max
值而不是which.max
,我们可以在上面的解决方案中使用Price==max(Price)
。此外,基于ave
的解决方案将是
res5 <- diamonds[with(diamonds, ave(price, carat, FUN=max)==price),]