【问题标题】:Performing calculations between rows in R在 R 中的行之间执行计算
【发布时间】:2019-02-25 21:52:48
【问题描述】:

我试图弄清楚如何跨行(或行间?)进行计算。我已经尝试查找此内容,但显然我的 Google-Fu 今天并不强大,因为我只是没有找到正确的搜索词。

这是我要处理的数据类型的一个超级简化示例:

mydf <- data.frame(pair = rep(1,2), 
                   participant = c("PartX", "PartY"), 
                   goalsAtt = c(6, 3), 
                   goalsScr = c(2, 3))

我们有关于参与者尝试了多少“进球”以及他们实际得分多少的数据,假设我想知道他们的“防守”能力。现在基本上我想要做的是mutate() 两个新列,称为...假设savedmissed,其中saved 将是对方参与者尝试的目标减去他们得分的目标,missed只是对方参与者的进球。所以显然参与者 X 会保存 0 并错过 3,参与者 Y 会保存 4 并错过 2。

现在显然这是一个愚蠢的简单示例,我将处理 6 种不同的“目标”类型和 2.5k 对,但我只是对从哪里开始有一个心理障碍.

这里是业余编码人员,我们赞赏 Tidyverse 风格的解决方案。

【问题讨论】:

  • 您是否尝试过一些代码?这两行是独立观察还是pair 变量将它们连接起来?如果是这样只能配对 2 个团队吗?
  • 如果总是只有两个参与者,那么这可能相当简单。但是,如果有两个以上,那么您对“已保存”等的比较就会变得更加复杂。这会按$pair 分组吗,每个唯一对总是正好有两行?

标签: r dataframe tidyverse


【解决方案1】:

好的,我们假设pair 只能用于 2 个团队。这是一个tidyverse 解决方案,我们首先为组内的位置设置索引号,然后减去保存的目标。错过目标的情况类似。

library(tidyverse)
mydf %>% 
  group_by(pair) %>% 
  mutate(id = row_number()) %>% 
  mutate(goalsSaved = if_else(id == 1,
                              lead(goalsAtt) - lead(goalsScr),
                              lag(goalsAtt) - lag(goalsScr))) %>% 
  mutate(goalsMissed = if_else(id == 1,
                               lead(goalsScr),
                               lag(goalsScr)))

# A tibble: 2 x 7
# Groups:   pair [1]
   pair participant goalsAtt goalsScr    id goalsSaved goalsMissed
   <dbl> <fct>          <dbl>    <dbl> <int>      <dbl>       <dbl>
 1     1 PartX              6        2     1          0           3
 2     1 PartY              3        3     2          4           2

【讨论】:

  • 感谢@nycrefugee,这正是我想要的。这基本上是我在想的,我只是没有意识到row_number() 索引分组变量中的行位置,我认为它只会使用它在整个数据框中的相对位置,这就是为什么我从来没有想过这会起作用,另外,我以前从未使用过lead()lag()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多