【问题标题】:Operations with a static row in RR中带有静态行的操作
【发布时间】:2023-03-07 17:10:01
【问题描述】:

我有一个df,其中前两行两个教室中好学生、普通学生和坏学生的百分比,以及全校好学生、普通学生和坏学生的百分比,如下所示:

  Classr Good Regular   Bad 
  <chr> <dbl>   <dbl> <dbl> 
1 A        30      10    60   
2 B        40      10    50   
3 PR       80      10    10 

我需要为任何教室计算一个索引,这是

的结果

|PRGood-GoodA|+|PRRegular-RegularA|+|PRBad-BadA|对于 B 班 |PRGood-GoodB|+|PRRegular-RegularB|+|PRBad-BadB|

在这个例子中,结果应该是:

  Classr Good Regular   Bad  INDEX
  <chr> <dbl>   <dbl> <dbl>  <dbl>
1 A        30      10    60    100  
2 B        40      10    50     80
3 PR       80      10    10     NA <- This value doesn't matter

你知道怎么做吗?

我尝试使用此代码,但收到一条错误消息:

df%>%
  mutate(across(2:4, ~.-tail(1,across(2:4)),))

【问题讨论】:

  • 如果你只有a类和b类,你可以将其他类的结果相加,得到那个类的索引。
  • 真正的df有上千个教室。

标签: r dplyr


【解决方案1】:

实现您想要的结果的一个选项可能如下所示:

library(dplyr)

mutate(d, INDEX = rowSums(across(c(Good, Regular, Bad), ~ abs(.x[length(.x)] - .x))))
#>   Classr Good Regular Bad INDEX
#> 1      A   30      10  60   100
#> 2      B   40      10  50    80
#> 3     PR   80      10  10     0

数据

d <- structure(list(Classr = c("A", "B", "PR"), Good = c(
  30L, 40L,
  80L
), Regular = c(10L, 10L, 10L), Bad = c(60L, 50L, 10L)), class = "data.frame", row.names = c(
  "1",
  "2", "3"
))

【讨论】:

  • 我正在尝试使用真正的 df,但仍然没有我想要的结果。出于任何原因,“索引”对所有行都重复相同的数字。
  • 嗯。不看你的真实数据就很难说。所以我只能猜测。您是否检查过您的数据未分组?
  • 我编辑了这个问题以更好地解释自己。使用您的代码,TOTAL 使用~ sum(.x) 重新计算,对吗?这与真实的 df 无关,因为它有百分比——由源直接提供。
  • 是的。如果无法根据数据计算总计行,则需要使用不同的方法。将删除我的答案,可能会再看一次。
  • .x 是向量,.x[length(.x)] 是向量的最后一个元素,.x[length(.x)] - .x 是向量减去最后一个元素(或相反),abs(...) 是绝对值(在控制台中尝试:使用例如.x &lt;- c(1,2,3); abs(.x[length(.x)] - .x)))使用across,我们对您的每一列进行此计算,最后通过rowSums 取行总和。
猜你喜欢
  • 2018-08-23
  • 1970-01-01
  • 1970-01-01
  • 2013-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多