使用 aggregate() 包含一个附加列
Include an additional column with aggregate()
我已经编写了一些代码来查看数据框并按一列中的最小值创建一个新数据框,并按一个因子拆分。但是,我不知道如何在结果中包含另一列(不将其用作一个因素)。
例如,以下代码创建了一个包含列 "State"、"Institution"、"Rating1"、"Rating2" 和 "Junkdata" 的数据框。然后,它会为列出的每个州找到 Rating 1 的最小值,并为每个州创建一个包含每个最小值的数据框。但是假设我想包括 "Institution" 列。我怎么做?
我也弄乱了一些 plyr 解决方案,但没有骰子。
这是我在没有指定 "Institution" 列的情况下使用的代码,足以说明我已经尝试将它放在我能想到的每个地方但没有成功。
##create the data frame
State <- c("AZ","AZ","AZ","CA","CA","CA","CA","CA","NY","NY","NY","NY","SD","SD")
Institution <- c("Institution 1","Institution 2","Institution 3","Institution 4","Institution 5","Institution 6","Institution 7","Institution 8","Institution 9","Institution 10","Institution 11","Institution 12","Institution 13","Institution 14")
Rating1 <- c(3.4, 5.6,2.2,6.3,8.3,2.1,3.3,9.7,7.7,5.4,9.9,3.2,6.1,5.2)
Rating2 <- c(8.4,3.4,6.5,2.5,7.5,4.2,5.6,8.3,4.9,3.3,1.1,8,7.7,3.3)
Junkdata <- c("junk","more junk","superfluous","junk","more junk","superfluous","junk","more junk","superfluous","junk","more junk","superfluous","junk","more junk")
data.df <- data.frame(State, Institution, Rating1, Rating2, Junkdata)
## Use aggregate to find the minimum of Rating 1 for each State
new.df <- aggregate(data.df$Rating1 ~ State, data.df, min)
使用 plyr:
library(plyr)
new.df.2 <- ddply(new.df, .(State), summarise, min=min(data.df$Rating1))
这很容易通过 dplyr 完成:
library(dplyr)
resultDF <- data.df %>%
group_by(State) %>%
filter(Rating1 == min(Rating1))
诀窍是按州分组。然后,当您应用过滤操作时,您只在每个州内查看,并且您 select Rating1 是该州内所有 Rating1 值的最小值的行。
回复评论中的问题
如果您只想包括州、机构和评级 1,您可以执行以下链:
resultDF <- data.df %>%
group_by(State) %>%
filter(Rating1 == min(Rating1)) %>%
select(State, Institution, Rating1)
我已经编写了一些代码来查看数据框并按一列中的最小值创建一个新数据框,并按一个因子拆分。但是,我不知道如何在结果中包含另一列(不将其用作一个因素)。
例如,以下代码创建了一个包含列 "State"、"Institution"、"Rating1"、"Rating2" 和 "Junkdata" 的数据框。然后,它会为列出的每个州找到 Rating 1 的最小值,并为每个州创建一个包含每个最小值的数据框。但是假设我想包括 "Institution" 列。我怎么做? 我也弄乱了一些 plyr 解决方案,但没有骰子。
这是我在没有指定 "Institution" 列的情况下使用的代码,足以说明我已经尝试将它放在我能想到的每个地方但没有成功。
##create the data frame
State <- c("AZ","AZ","AZ","CA","CA","CA","CA","CA","NY","NY","NY","NY","SD","SD")
Institution <- c("Institution 1","Institution 2","Institution 3","Institution 4","Institution 5","Institution 6","Institution 7","Institution 8","Institution 9","Institution 10","Institution 11","Institution 12","Institution 13","Institution 14")
Rating1 <- c(3.4, 5.6,2.2,6.3,8.3,2.1,3.3,9.7,7.7,5.4,9.9,3.2,6.1,5.2)
Rating2 <- c(8.4,3.4,6.5,2.5,7.5,4.2,5.6,8.3,4.9,3.3,1.1,8,7.7,3.3)
Junkdata <- c("junk","more junk","superfluous","junk","more junk","superfluous","junk","more junk","superfluous","junk","more junk","superfluous","junk","more junk")
data.df <- data.frame(State, Institution, Rating1, Rating2, Junkdata)
## Use aggregate to find the minimum of Rating 1 for each State
new.df <- aggregate(data.df$Rating1 ~ State, data.df, min)
使用 plyr:
library(plyr)
new.df.2 <- ddply(new.df, .(State), summarise, min=min(data.df$Rating1))
这很容易通过 dplyr 完成:
library(dplyr)
resultDF <- data.df %>%
group_by(State) %>%
filter(Rating1 == min(Rating1))
诀窍是按州分组。然后,当您应用过滤操作时,您只在每个州内查看,并且您 select Rating1 是该州内所有 Rating1 值的最小值的行。
回复评论中的问题 如果您只想包括州、机构和评级 1,您可以执行以下链:
resultDF <- data.df %>%
group_by(State) %>%
filter(Rating1 == min(Rating1)) %>%
select(State, Institution, Rating1)