【问题标题】:R: Dividing Second Row by First Row per GroupR:将第二行除以每组的第一行
【发布时间】:2022-08-02 15:30:58
【问题描述】:

我正在使用 R 编程语言。我有以下格式的数据:

name = c(\"john\", \"john\", \"jack\", \"jack\", \"jason\", \"jason\")
time_to_run_100_meters_last_year_this_year = c(22.3, 22.1, 12.4, 12.3, 15.1, 15.6)

my_data = data.frame(name, time_to_run_100_meters_last_year_this_year)


   name time_to_run_100_meters_last_year_this_year
1  john                                       22.3
2  john                                       22.1
3  jack                                       12.4
4  jack                                       12.3
5 jason                                       15.1
6 jason                                       15.6

我想了解每个学生的百分比随时间变化的情况。这意味着:(22.1/22.3、12.3/12.4、15.6/15.1)。

我想到了以下方法来解决这个问题:

    library(dplyr)
my_data = my_data %>% 
  arrange(name) %>%
  group_by(name) %>% 
  mutate(id = row_number()) %>%
  ungroup()


id_1 =  my_data[which(my_data$id == 1), ]

id_2 =  my_data[which(my_data$id == 2), ]

division =  id_2$time_to_run_100_meters_last_year_this_year/id_1$time_to_run_100_meters_last_year_this_year

unique = unique(my_data$name)

final_data = data.frame(unique, division)

最后,我认为我的想法奏效了:

> final_data
  unique  division
1   jack 0.9919355
2  jason 1.0331126
3   john 0.9910314

我的问题:但是有没有更好的方法来解决这个问题?

谢谢!

  • 你能保证每组恰好有两个观察值吗?

标签: r dplyr data-manipulation


【解决方案1】:

您可以在包dplyr 中使用group_bysummarize

使用lead 作为当前行后面的值,使用na.omit 在计算中忽略NA

library(dplyr)

final_data <- 
  my_data %>% 
  group_by(name) %>% 
  summarize(division = na.omit(lead(time_to_run_100_meters_last_year_this_year)/time_to_run_100_meters_last_year_this_year))

final_data
# A tibble: 3 × 2
  name  division
  <chr>    <dbl>
1 jack     0.992
2 jason    1.03 
3 john     0.991

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-02
    • 2016-09-05
    • 1970-01-01
    相关资源
    最近更新 更多