R - 将数据框中的值与聚合数据框进行比较
R - Compare values in a dataframe to aggregated dataframe
我正在尝试找出如何逐行比较数据帧中与 aggregate()
函数给出的值相对应的值。
例如:
#create data frame
df <- data.frame(team=c('a', 'a', 'b', 'b', 'b', 'c', 'c'),
pts=c(5, 8, 14, 18, 5, 7, 7),
rebs=c(8, 8, 9, 3, 8, 7, 4))
#view data frame
df
team pts rebs
1 a 5 8
2 a 8 8
3 b 14 9
4 b 18 3
5 b 5 8
6 c 7 7
7 c 7 4
#find mean points scored by team
agg_df = aggregate(df$pts, list(df$team), FUN=mean)
Group.1 x
1 a 6.50000
2 b 12.33333
3 c 7.00000
我想做的是使用类似于以下伪代码的逻辑在 df
中创建一个新列:
df$pts[i] > agg_df$x[i]
然后 df$performance = 'overperformed'
否则 df$performance = 'underperformed'
.
但这并不是我想要的。我想将第 1 行和第 2 行的分数与 agg_df
中 a 队的平均分数进行比较。同样,df
中的第 3-5 行应与 agg_df
.
中 b 组的平均分进行比较
最终结果如下:
> df
team pts rebs performance
1 a 5 8 under
2 a 8 8 over
3 b 14 9 over
4 b 18 3 over
5 b 5 8 under
6 c 7 7 average
7 c 7 4 average
我对如何实现这一目标感到有些困惑,或者它是否可以实现,因此非常感谢您的帮助。
你可以这样做:
library(tidyverse)
df %>%
group_by(team) %>%
mutate(performance = case_when(pts > mean(pts) ~ "over",
pts == mean(pts) ~ "average",
pts < mean(pts) ~ "under")) %>%
ungroup()
给出:
# A tibble: 7 x 4
team pts rebs performance
<chr> <dbl> <dbl> <chr>
1 a 5 8 under
2 a 8 8 over
3 b 14 9 over
4 b 18 3 over
5 b 5 8 under
6 c 7 7 average
7 c 7 4 average
或以 merge()
的基本方式。
# Merge data
db <- merge(df, agg_df, by.x = "team", by.y = 'Group.1')
db$performance <- ifelse(db$pts == db$x, 'average',
ifelse(db$pts > db$x, 'over', 'under'))
db$x <- NULL
db
我正在尝试找出如何逐行比较数据帧中与 aggregate()
函数给出的值相对应的值。
例如:
#create data frame
df <- data.frame(team=c('a', 'a', 'b', 'b', 'b', 'c', 'c'),
pts=c(5, 8, 14, 18, 5, 7, 7),
rebs=c(8, 8, 9, 3, 8, 7, 4))
#view data frame
df
team pts rebs
1 a 5 8
2 a 8 8
3 b 14 9
4 b 18 3
5 b 5 8
6 c 7 7
7 c 7 4
#find mean points scored by team
agg_df = aggregate(df$pts, list(df$team), FUN=mean)
Group.1 x
1 a 6.50000
2 b 12.33333
3 c 7.00000
我想做的是使用类似于以下伪代码的逻辑在 df
中创建一个新列:
df$pts[i] > agg_df$x[i]
然后 df$performance = 'overperformed'
否则 df$performance = 'underperformed'
.
但这并不是我想要的。我想将第 1 行和第 2 行的分数与 agg_df
中 a 队的平均分数进行比较。同样,df
中的第 3-5 行应与 agg_df
.
最终结果如下:
> df
team pts rebs performance
1 a 5 8 under
2 a 8 8 over
3 b 14 9 over
4 b 18 3 over
5 b 5 8 under
6 c 7 7 average
7 c 7 4 average
我对如何实现这一目标感到有些困惑,或者它是否可以实现,因此非常感谢您的帮助。
你可以这样做:
library(tidyverse)
df %>%
group_by(team) %>%
mutate(performance = case_when(pts > mean(pts) ~ "over",
pts == mean(pts) ~ "average",
pts < mean(pts) ~ "under")) %>%
ungroup()
给出:
# A tibble: 7 x 4
team pts rebs performance
<chr> <dbl> <dbl> <chr>
1 a 5 8 under
2 a 8 8 over
3 b 14 9 over
4 b 18 3 over
5 b 5 8 under
6 c 7 7 average
7 c 7 4 average
或以 merge()
的基本方式。
# Merge data
db <- merge(df, agg_df, by.x = "team", by.y = 'Group.1')
db$performance <- ifelse(db$pts == db$x, 'average',
ifelse(db$pts > db$x, 'over', 'under'))
db$x <- NULL
db