Я хочу создать подмножество приведенных ниже данных candyData в R таким образом, чтобы я мог сгруппировать данные по брендам, и для каждого уникального бренда я должен найти и распечатать максимум A и B. Для иллюстрации новые данные должны иметь Brand значение Nestle появляется дважды, соответствующие значения Candy Value A и B отображаются один раз, соответствующие Nestle и их максимальные значения в третьем столбце. Аналогично для всех значений бренда. Спасибо и пожалуйста, помогите.
candyData <- read.table(
text = "
Brand Candy value
Nestle A 12
Nestle B 34
Nestle A 32
Hershey's A 55
Hershey's B 14
Hershey's B 19
Mars B 24
Nestle B 26
Nestle A 28
Hershey's B 23
Hershey's B 23
Hershey's A 65
Mars A 23
Mars B 34",
header = TRUE,
stringsAsFactors = FALSE)
попробуй это:
library(dplyr)
candyData %>%
group_by(Brand, Candy) %>%
summarise(max=max(value))
вывод будет:
# A tibble: 6 x 3
# Groups: Brand [?]
Brand Candy max
<chr> <chr> <dbl>
1 Hershey's A 65.
2 Hershey's B 23.
3 Mars A 23.
4 Mars B 34.
5 Nestle A 32.
6 Nestle B 34.
Хотя мой ответ далеко не такой элегантный, как ответ с использованием dplyr
, я создал решение, используя базовый R.
splittedData <- split(candyData,candyData$Brand)
resultDf <- data.frame(matrix(ncol = 3))
colnames(resultDf) <- c("Brand", "Candy", "maxValue")
insertIndex<-1
for(dfIndex in 1:length(splittedData)) {
tempDf <- splittedData[[dfIndex]]
tableDf <- data.frame(table(tempDf$Candy))
tableDf[,1] <- as.character(tableDf[,1])
for(i in 1:nrow(tableDf)) {
resultDf[insertIndex, 1] <- tempDf$Brand[1]
resultDf[insertIndex, 2] <- tableDf[i,1]
resultDf[insertIndex, 3] <- max(tempDf$value[tempDf$Candy==tableDf[i,1]])
insertIndex <- insertIndex + 1
}
}
Вывод - новый df:
Brand Candy maxValue
1 Hershey's A 65
2 Hershey's B 23
3 Mars A 23
4 Mars B 34
5 Nestle A 32
6 Nestle B 34
aggregate(value ~ ., candyData, max)
Это группирует candyData
по Brand
и Candy
(поскольку все они являются столбцами, кроме value
; .
делает это) и дает max
из value
для каждой группы.
Отличный ответ. Обязательно стоит изучить aggregate
. Спасибо @ Jordi
это подход, который я бы предложил (+1)
Просто добавим еще несколько решений:
cd <- read.table(
text = "
Brand Candy value
Nestle A 12
Nestle B 34
Nestle A 32
Hershey's A 55
Hershey's B 14
Hershey's B 19
Mars B 24
Nestle B 26
Nestle A 28
Hershey's B 23
Hershey's B 23
Hershey's A 65
Mars A 23
Mars B 34",
header = TRUE,
stringsAsFactors = FALSE)
#using split + lapply or equivalently, by
c(by(cd$value, paste(cd$Brand, cd$Candy), max))
#using tapply i.e. apply to each group
tapply(cd$value, paste(cd$Brand, cd$Candy), max)
#using data.table
library(data.table)
setDT(cd)[, .(Max=max(value)), by=.(Brand, Candy)]
#using sqldf
library(sqldf)
sqldf("select Brand, Candy, max(value) as Max from cd group by Brand, Candy")
Используя предоставленные данные примера и data.table
:
library(data.table)
setDT(candyData)
candyData[,.(Max = max(value)), keyby = .(Brand,Candy)]
дает
Brand Candy Max
1: Hershey's A 65
2: Hershey's B 23
3: Mars A 23
4: Mars B 34
5: Nestle A 32
6: Nestle B 34
Вы можете попробовать это: candyData%>% dplyr :: group_by (Brand, Candy)%>% dplyr :: summarize (maxValue = max (value))