首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R:确定组内某些子组的最大值和最小值的差异

R:确定组内某些子组的最大值和最小值的差异
EN

Stack Overflow用户
提问于 2018-08-21 19:25:28
回答 3查看 1.2K关注 0票数 2

下面的示例数据字段

代码语言:javascript
运行
复制
Event        Ethnicity        Score
50 yd dash    Asian             7
50 yd dash    Afr. Am           8
50 yd dash    White             5
Hurdle        Asian             6
Hurdle        Afr. Am           8
Hurdle        White             9

我试图确定在每个事件中的某些种族之间的区别,希望使用dplyr或在tidyverse中的什么东西,但将接受任何答复/帮助。例如,亚洲组和白人组在每一项赛事中的差异,

例如,亚洲(7) -白色(5) =差(2),

其结果如下所示:

代码语言:javascript
运行
复制
Event          Difference
50 yd dash         2
Hurdle            -3
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-08-21 19:33:28

使用以下方法可以帮助您达到此目的:

代码语言:javascript
运行
复制
library(tidyverse)

df %>%
    spread(Ethnicity, Score) %>%
    mutate("Difference" = Asian - White) %>%
    select(-Asian, -White, -`Afr. Am`)
#       Event Difference
#1 50 yd dash          2
#2     Hurdle         -3

数据.

代码语言:javascript
运行
复制
df <-
structure(list(Event = structure(c(1L, 1L, 1L, 2L, 2L, 2L), .Label = c("50 yd dash", 
"Hurdle"), class = "factor"), Ethnicity = structure(c(2L, 1L, 
3L, 2L, 1L, 3L), .Label = c("Afr. Am", "Asian", "White"), class = "factor"), 
    Score = c(7L, 8L, 5L, 6L, 8L, 9L)), class = "data.frame", row.names = c(NA, 
-6L))

@AntoniosK已经在OP发布的数据中发布了一种read.table读取方式,但我的方法有点不同。我没有从列的值中删除空格,而是将它们放在单引号之间。(它必须是单引号,因为指令将参数text的值放在双引号之间。)

代码语言:javascript
运行
复制
df <- read.table(text = "
Event        Ethnicity        Score
'50 yd dash'    Asian             7
'50 yd dash'    'Afr. Am'           8
'50 yd dash'    White             5
Hurdle        Asian             6
Hurdle        'Afr. Am'           8
Hurdle        White             9
", header = TRUE)
票数 4
EN

Stack Overflow用户

发布于 2018-08-21 19:49:42

数据

代码语言:javascript
运行
复制
df = read.table(text = "
Event        Ethnicity        Score
50yddash    Asian             7
50yddash    Afr.Am           8
50yddash    White             5
Hurdle        Asian             6
Hurdle        Afr.Am           8
Hurdle        White             9
", header=T, stringsAsFactors=F)

First approach,在这里手动指定感兴趣的族裔:

代码语言:javascript
运行
复制
library(dplyr)

df %>%
  group_by(Event) %>%
  summarise(Diff = Score[Ethnicity=="Asian"] - Score[Ethnicity=="White"])

# # A tibble: 2 x 2
#   Event     Diff
#   <chr>    <int>
# 1 50yddash     2
# 2 Hurdle      -3

您可以使用这段代码作为一个函数(输入两个感兴趣的族裔)。

第二种方法,您为所有种族和事件的独特组合创建所有差异:

代码语言:javascript
运行
复制
library(tidyverse)

# create vectorised function that calculates the difference
# based on a given event and ethnicities
f = function(event, eth1, eth2) {
  df$Score[df$Event==event & df$Ethnicity==eth1] -
  df$Score[df$Event==event & df$Ethnicity==eth2] }
f = Vectorize(f)


data.frame(t(combn(unique(df$Ethnicity), 2)), stringsAsFactors = F) %>% # create combinations of ethnicities
  mutate(Event = list(unique(df$Event))) %>%                            # create combinations with events
  unnest() %>%
  mutate(Diff = f(Event, X1, X2))                                       # apply the function

#    X1     X2    Event Diff
# 1  Asian Afr.Am 50yddash   -1
# 2  Asian Afr.Am   Hurdle   -2
# 3  Asian  White 50yddash    2
# 4  Asian  White   Hurdle   -3
# 5 Afr.Am  White 50yddash    3
# 6 Afr.Am  White   Hurdle   -1

此过程使用字母顺序来创建独特的差异。如果您想要所有这些(即亚洲白人和白人-亚洲人),您可以使用这个

代码语言:javascript
运行
复制
expand.grid(Event = unique(df$Event),
            X1 = unique(df$Ethnicity),
            X2 = unique(df$Ethnicity)) %>%
  filter(X1 != X2) %>%
  mutate(Diff = f(Event, X1, X2))                                     

#    Event     X1     X2 Diff
# 1  50yddash Afr.Am  Asian    1
# 2    Hurdle Afr.Am  Asian    2
# 3  50yddash  White  Asian   -2
# 4    Hurdle  White  Asian    3
# 5  50yddash  Asian Afr.Am   -1
# 6    Hurdle  Asian Afr.Am   -2
# 7  50yddash  White Afr.Am   -3
# 8    Hurdle  White Afr.Am    1
# 9  50yddash  Asian  White    2
# 10   Hurdle  Asian  White   -3
# 11 50yddash Afr.Am  White    3
# 12   Hurdle Afr.Am  White   -1
票数 3
EN

Stack Overflow用户

发布于 2018-08-21 19:42:16

代码语言:javascript
运行
复制
df %>%
  mutate(rn = row_number()) %>%
  spread(Ethnicity, Score) %>%
  group_by(Event) %>%
  summarise(Difference = max(Asian, na.rm = T) - max(White, na.rm = T))

# # A tibble: 2 x 2
#   Event      Difference
#   <chr>           <dbl>
# 1 50 yd dash          2
# 2 Hurdle             -3

数据:

代码语言:javascript
运行
复制
df <- 
structure(list(Event = c("50 yd dash", "50 yd dash", "50 yd dash", 
"Hurdle", "Hurdle", "Hurdle"), Ethnicity = c("Asian", "Afr. Am", 
"White", "Asian", "Afr. Am", "White"), Score = c(7, 8, 5, 6, 
8, 9)), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame"
))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51955425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档