gpt4 book ai didi

r - 对具有由该行中的另一个值指定的动态列范围的行求和

转载 作者:行者123 更新时间:2023-12-03 07:52:09 25 4
gpt4 key购买 nike

我正在处理一年中几个月的一组二进制数据,类似于下面的示例标题,但有数万行。我正在尝试向现有表添加一列,该列对列 Month 指定的月份之间的每一行进行求和。最后一个月 Dec 。例如,我将对列 Nov:Dec 求和= 0 表示第一行,May:Dec = 8 表示第二个,Jan:Dec = 11 代表最后一个,依此类推

library(tidyverse)

df <- tribble(
~Jan,~Feb,~Mar,~Apr,~May,~Jun,~Jul,~Aug,~Sep,~Oct,~Nov,~Dec,~Month,~Expected,
1,0,0,0,0,0,0,0,0,0,0,0,"Nov",0,
0,1,1,1,1,1,1,1,1,1,1,1,"May",8,
0,0,1,1,1,1,1,1,1,1,1,1,"Aug",5,
0,0,0,1,1,1,1,1,1,1,1,1,"Jan",9,
0,0,0,0,1,1,1,1,1,1,1,1,"Dec",1,
0,0,0,0,0,1,1,1,1,1,1,1,"May",7,
0,0,0,0,0,0,1,1,1,1,1,1,"Jun",6,
0,0,0,0,0,0,0,1,1,1,1,1,"Jul",5,
0,0,0,0,0,0,0,0,1,1,1,1,"Feb",4,
0,0,0,0,0,0,0,0,0,1,1,1,"Oct",3,
0,0,0,0,0,0,0,0,0,0,1,1,"Mar",2,
1,1,1,1,1,1,1,1,1,1,1,0,"Jan",11,
)

我尝试使用mutate()sum()以行方式运行函数,具有基于每个相应行的月份值的动态列范围 n() 。但是,仅使用月份(11 月)的第一行值 - 因此,我得到列范围 Nov:Dec 的总和,而不是使用 df 中显示的“预期”总和创建新列。对于每一行。

test <- df |> 
rowwise() |>
mutate(
Actual = sum(c_across(df$Month[n()]:Dec))
)

> test
# A tibble: 12 × 15
# Rowwise:
Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec Month Expected Actual
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <chr> <dbl> <dbl>
1 1 0 0 0 0 0 0 0 0 0 0 0 Nov 0 0
2 0 1 1 1 1 1 1 1 1 1 1 1 May 8 2
3 0 0 1 1 1 1 1 1 1 1 1 1 Aug 5 2
4 0 0 0 1 1 1 1 1 1 1 1 1 Jan 9 2
5 0 0 0 0 1 1 1 1 1 1 1 1 Dec 1 2
6 0 0 0 0 0 1 1 1 1 1 1 1 May 7 2
7 0 0 0 0 0 0 1 1 1 1 1 1 Jun 6 2
8 0 0 0 0 0 0 0 1 1 1 1 1 Jul 5 2
9 0 0 0 0 0 0 0 0 1 1 1 1 Feb 4 2
10 0 0 0 0 0 0 0 0 0 1 1 1 Oct 3 2
11 0 0 0 0 0 0 0 0 0 0 1 1 Mar 2 2
12 1 1 1 1 1 1 1 1 1 1 1 0 Jan 11 1

我已经审阅了其他具有类似目标(尽管不同)的帖子( 123 ),但我仍在努力寻找解决方案。任何帮助或建议将不胜感激!

最佳答案

您可以将Month转换为有序因子,并对名称大于或等于Month的列进行行求和。

library(dplyr)

df %>%
mutate(Month = ordered(Month, levels = month.abb),
Result = rowSums(across(Jan:Dec, ~ ifelse(cur_column() >= Month, .x, 0))))

# # A tibble: 12 × 15
# Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec Month Expected Result
# <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <ord> <dbl> <dbl>
# 1 1 0 0 0 0 0 0 0 0 0 0 0 Nov 0 0
# 2 0 1 1 1 1 1 1 1 1 1 1 1 May 8 8
# 3 0 0 1 1 1 1 1 1 1 1 1 1 Aug 5 5
# 4 0 0 0 1 1 1 1 1 1 1 1 1 Jan 9 9
# 5 0 0 0 0 1 1 1 1 1 1 1 1 Dec 1 1
# 6 0 0 0 0 0 1 1 1 1 1 1 1 May 7 7
# 7 0 0 0 0 0 0 1 1 1 1 1 1 Jun 6 6
# 8 0 0 0 0 0 0 0 1 1 1 1 1 Jul 5 5
# 9 0 0 0 0 0 0 0 0 1 1 1 1 Feb 4 4
# 10 0 0 0 0 0 0 0 0 0 1 1 1 Oct 3 3
# 11 0 0 0 0 0 0 0 0 0 0 1 1 Mar 2 2
# 12 1 1 1 1 1 1 1 1 1 1 1 0 Jan 11 11

注意: 此处必须使用 ordered() 而不是 factor(),因为 >= 不是对于普通因素有意义。


关于r - 对具有由该行中的另一个值指定的动态列范围的行求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76920845/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com