Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中创建*新*多条件(函数)列_R_Conditional_Mean_Calculated Columns_Moving Average - Fatal编程技术网

在R中创建*新*多条件(函数)列

在R中创建*新*多条件(函数)列,r,conditional,mean,calculated-columns,moving-average,R,Conditional,Mean,Calculated Columns,Moving Average,我正在尝试基于两个条件创建一个新的条件列。我想根据名称和相应行中的星期之前(但不包括)的星期来查找A、B和C列的平均值。让我们以乔为例。对于第1行,新列中没有数据。对于第2行,将具有第1周数据的“平均值”。对于第3行,我们需要第1周和第2周数据的平均值。实际上,我们可以有超过3周的时间,但我想简化这个例子。如果可能的话,我希望避免循环 在Excel中使用Averageifs()函数很容易做到这一点,但我想用R自动化/整合这一过程 我的数据如下所示: Name Week A B C Joe 1

我正在尝试基于两个条件创建一个新的条件列。我想根据名称和相应行中的星期之前(但不包括)的星期来查找A、B和C列的平均值。让我们以乔为例。对于第1行,新列中没有数据。对于第2行,将具有第1周数据的“平均值”。对于第3行,我们需要第1周和第2周数据的平均值。实际上,我们可以有超过3周的时间,但我想简化这个例子。如果可能的话,我希望避免循环

在Excel中使用Averageifs()函数很容易做到这一点,但我想用R自动化/整合这一过程

我的数据如下所示:

Name Week A B C
Joe  1    5 6 7
Joe  2    4 5 6
Joe  3    2 3 4
Tim  1    7 8 9
Tim  2    5 4 6 
Tim  4    3 5 4
Bob  1    9 8 7
Bob  3    8 5 2
Bob  4    4 5 3
    Name Week A B C    A_2 B_2 C_2
    Joe  1    5 6 7    NA  NA  NA
    Joe  2    4 5 6    5   6   7
    Joe  3    2 3 4    4.5 5.5 6.5
    Tim  1    7 8 9    NA  NA  NA
    Tim  2    5 4 6    7   8   9
    Tim  4    3 5 4    6   6   7.5
    Bob  1    9 8 7    NA  NA  NA
    Bob  3    8 5 2    9   8   7
    Bob  4    4 5 3    8.5 6.5 4.5
新数据将如下所示:

Name Week A B C
Joe  1    5 6 7
Joe  2    4 5 6
Joe  3    2 3 4
Tim  1    7 8 9
Tim  2    5 4 6 
Tim  4    3 5 4
Bob  1    9 8 7
Bob  3    8 5 2
Bob  4    4 5 3
    Name Week A B C    A_2 B_2 C_2
    Joe  1    5 6 7    NA  NA  NA
    Joe  2    4 5 6    5   6   7
    Joe  3    2 3 4    4.5 5.5 6.5
    Tim  1    7 8 9    NA  NA  NA
    Tim  2    5 4 6    7   8   9
    Tim  4    3 5 4    6   6   7.5
    Bob  1    9 8 7    NA  NA  NA
    Bob  3    8 5 2    9   8   7
    Bob  4    4 5 3    8.5 6.5 4.5

谢谢你能提供的任何帮助!我是R的新手,一直在努力解决这个问题-

df %>%
  group_by(Name) %>% 
  arrange(Name, Week) %>% 
  mutate(
    A_2 = lag(cummean(A)),
    B_2 = lag(cummean(B)),
    C_2 = lag(cummean(C))
  ) %>% 
  ungroup()

# A tibble: 9 x 8
  Name   Week     A     B     C   A_2   B_2   C_2
  <fct> <int> <int> <int> <int> <dbl> <dbl> <dbl>
1 Bob       1     9     8     7 NA    NA    NA   
2 Bob       3     8     5     2  9.00  8.00  7.00
3 Bob       4     4     5     3  8.50  6.50  4.50
4 Joe       1     5     6     7 NA    NA    NA   
5 Joe       2     4     5     6  5.00  6.00  7.00
6 Joe       3     2     3     4  4.50  5.50  6.50
7 Tim       1     7     8     9 NA    NA    NA   
8 Tim       2     5     4     6  7.00  8.00  9.00
9 Tim       4     3     5     4  6.00  6.00  7.50
df%>%
分组单位(名称)%>%
安排(姓名,周)%%>%
变异(
A_2=滞后(平均值(A)),
B_2=滞后(平均值(B)),
C_2=滞后(平均值(C))
) %>% 
解组()
#一个tibble:9x8
命名周A B C A_2 B_2 C_2
1 Bob 19 8 7不适用不适用不适用不适用
2鲍勃385529.008.007.00
3鲍勃4 5 3 8.50 6.50 4.50
4乔1 5 6 7纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳
5乔2 4 5 6 5.00 6.00 7.00
6乔3 2 3 4 4.50 5.50 6.50
7蒂姆1 7 8 9纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳纳
8 Tim 2 5 4 6 7.00 8.00 9.00
9 Tim 4 3 5 4 6.00 6.00 7.50

资料-

df <- structure(list(Name = structure(c(2L, 2L, 2L, 3L, 3L, 3L, 1L, 
1L, 1L), .Label = c("Bob", "Joe", "Tim"), class = "factor"), 
    Week = c(1L, 2L, 3L, 1L, 2L, 4L, 1L, 3L, 4L), A = c(5L, 4L, 
    2L, 7L, 5L, 3L, 9L, 8L, 4L), B = c(6L, 5L, 3L, 8L, 4L, 5L, 
    8L, 5L, 5L), C = c(7L, 6L, 4L, 9L, 6L, 4L, 7L, 2L, 3L)), .Names = c("Name", 
"Week", "A", "B", "C"), class = "data.frame", row.names = c(NA, 
-9L))

dfA
数据表
方法:

library(data.table)

setDT(df)[order(Name, Week),][, `:=` (
                  A_mean = shift(cummean(A)),
                  B_mean = shift(cummean(B)),
                  C_mean = shift(cummean(C))
                  ), by = Name][]
请注意,末尾的
[]
仅用于打印结果

输出:

   Name Week A B C A_mean B_mean C_mean
1:  Bob    1 9 8 7     NA     NA     NA
2:  Bob    3 8 5 2    9.0    8.0    7.0
3:  Bob    4 4 5 3    8.5    6.5    4.5
4:  Joe    1 5 6 7     NA     NA     NA
5:  Joe    2 4 5 6    5.0    6.0    7.0
6:  Joe    3 2 3 4    4.5    5.5    6.5
7:  Tim    1 7 8 9     NA     NA     NA
8:  Tim    2 5 4 6    7.0    8.0    9.0
9:  Tim    4 3 5 4    6.0    6.0    7.5

你会不会也知道用标准差做这件事的方法?本质上,“累积标准偏差”使用此函数-
cumsd a+++您是最好的!还有一个问题,如果我想要最后3周(或n周)怎么办?而不是本周之前的所有周,例如,
cumsum(x)/seq_沿(x)