R:为每个组创建一个新行,值是组中现有条目的差异

发布于 2025-02-13 15:19:03 字数 1654 浏览 1 评论 0原文

区域年龄学生类型
A17任何32
A17全职24
A18A 18 Any27
A18全职19
B17Any22
B17全职14
B18Any80
B18全职75

我在R.我希望为每个地区和年龄创建一个新的拖车,学生类型是“兼职”,价值是“任何” - “全职”的价值。看来我可以在此过程中使用滞后,但是我希望更加明确,指定它是“任何” - “全职”,就像井井有条的数据集时,可能有数据集可以逆转条目。

理想情况下,结果看起来像是

区域年龄学生类型
A17ANER32
A17全职24
A17兼职8
A 18 A18Any27
A188A 18
A18A兼职B
17Any22 B 17 Any22
B17全职14
B17兼职8
b18任何80
B18全职75
B18兼职5

谢谢!

RegionAgeStudent TypeValues
A17Any32
A17Full time24
A18Any27
A18Full time19
B17Any22
B17Full time14
B18Any80
B18Full time75

I am working with this dataset in R. I am hoping to create a new tow for each region and age, with student type being "Part time" and values being the values of "Any" - "Full time". It seems I can use lag in the process, but I was hoping to be more explicit, specifying it is "Any" - "Full time", as while this dataset is well organized there may be data sets where entries are reversed.

Ideally the result would look something like

RegionAgeStudent TypeValues
A17Any32
A17Full time24
A17Part time8
A18Any27
A18Full time19
A18Part time8
B17Any22
B17Full time14
B17Part time8
B18Any80
B18Full time75
B18Part time5

Thank you!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

笛声青案梦长安 2025-02-20 15:19:03

您可以尝试

library(dplyr)
df %>%
  group_by(Region, Age) %>%
  summarize(Student.Type = "Part time",
            Values = abs(diff(Values))) %>%
  rbind(., df) %>%
  arrange(Region, Age, Student.Type)

   Region   Age Student.Type Values
   <chr>  <int> <chr>         <int>
 1 A         17 Any              32
 2 A         17 Full time        24
 3 A         17 Part time         8
 4 A         18 Any              27
 5 A         18 Full time        19
 6 A         18 Part time         8
 7 B         17 Any              22
 8 B         17 Full time        14
 9 B         17 Part time         8
10 B         18 Any              80
11 B         18 Full time        75
12 B         18 Part time         5

You may try

library(dplyr)
df %>%
  group_by(Region, Age) %>%
  summarize(Student.Type = "Part time",
            Values = abs(diff(Values))) %>%
  rbind(., df) %>%
  arrange(Region, Age, Student.Type)

   Region   Age Student.Type Values
   <chr>  <int> <chr>         <int>
 1 A         17 Any              32
 2 A         17 Full time        24
 3 A         17 Part time         8
 4 A         18 Any              27
 5 A         18 Full time        19
 6 A         18 Part time         8
 7 B         17 Any              22
 8 B         17 Full time        14
 9 B         17 Part time         8
10 B         18 Any              80
11 B         18 Full time        75
12 B         18 Part time         5
梦过后 2025-02-20 15:19:03

使用dplyr,您可以使用group_modify() + add_row()

df %>%
  group_by(Region, Age) %>%
  group_modify(~ {
    .x %>%
      summarise(StudentType = "Part time", Values = -diff(Values)) %>%
      add_row(.x, .)
  }) %>%
  ungroup()

# # A tibble: 12 × 4
#    Region   Age StudentType    Values
#    <chr>  <int> <chr>           <int>
#  1 A         17 Any                32
#  2 A         17 Full time          24
#  3 A         17 Part time           8
#  4 A         18 Any                27
#  5 A         18 Full time          19
#  6 A         18 Part time           8
#  7 B         17 Any                22
#  8 B         17 Full time          14
#  9 B         17 Part time           8
# 10 B         18 Any                80
# 11 B         18 Full time          75
# 12 B         18 Part time           5

With dplyr, you could use group_modify() + add_row().

df %>%
  group_by(Region, Age) %>%
  group_modify(~ {
    .x %>%
      summarise(StudentType = "Part time", Values = -diff(Values)) %>%
      add_row(.x, .)
  }) %>%
  ungroup()

# # A tibble: 12 × 4
#    Region   Age StudentType    Values
#    <chr>  <int> <chr>           <int>
#  1 A         17 Any                32
#  2 A         17 Full time          24
#  3 A         17 Part time           8
#  4 A         18 Any                27
#  5 A         18 Full time          19
#  6 A         18 Part time           8
#  7 B         17 Any                22
#  8 B         17 Full time          14
#  9 B         17 Part time           8
# 10 B         18 Any                80
# 11 B         18 Full time          75
# 12 B         18 Part time           5
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文