R-取前4行的平均值并展开表

R-取前4行的平均值并展开表,r,R,我有一张像这样的桌子: Texas Colorado 3 1 4 2 3 3 4 4 我想将这个表扩展30行,这样,每一新行取前4行的平均值。预期产出: Texas Colorado 3 1 4 2 3 3 4 4 3.5 2.5 3.625 2.875 我的主要问题是我不知道如何动态创建行我们可以从zoo library(zoo) for(i in 1:30) df1 <- rbind(df1, roll

我有一张像这样的桌子:

Texas Colorado

3      1
4      2
3      3
4      4
我想将这个表扩展30行,这样,每一新行取前4行的平均值。预期产出:

Texas Colorado

3     1
4     2
3     3
4     4
3.5   2.5
3.625 2.875

我的主要问题是我不知道如何动态创建行

我们可以从
zoo

library(zoo)
for(i in 1:30) df1 <- rbind(df1, rollmeanr(tail(df1, 4), k = 4))
df1
#      Texas Colorado
#1  3.000000 1.000000
#2  4.000000 2.000000
#3  3.000000 3.000000
#4  4.000000 4.000000
#5  3.500000 2.500000
#6  3.625000 2.875000
#7  3.531250 3.093750
#8  3.664062 3.117188
#9  3.580078 2.896484
#10 3.600098 2.995605
#11 3.593872 3.025757
#12 3.609528 3.008759
#13 3.595894 2.981651
#14 3.599848 3.002943
#15 3.599785 3.004777
#16 3.601264 2.999533
#17 3.599198 2.997226
#18 3.600024 3.001120
#19 3.600068 3.000664
#20 3.600138 2.999636
#21 3.599857 2.999661
#22 3.600022 3.000270
#23 3.600021 3.000058
#24 3.600009 2.999906
#25 3.599977 2.999974
#26 3.600007 3.000052
#27 3.600004 2.999997
#28 3.599999 2.999982
#29 3.599997 3.000001
#30 3.600002 3.000008
#31 3.600000 2.999997
#32 3.600000 2.999997
#33 3.600000 3.000001
#34 3.600000 3.000001

或使用
累计

seq_len(30) %>%
    accumulate(.,  ~ .x %>% 
    slice(tail(row_number(), 4)) %>% 
    summarise_all(mean) %>%
    bind_rows(.x, .), .init = df1) %>%
    .[[30]]
#    Texas Colorado
#1  3.000000 1.000000
#2  4.000000 2.000000
#3  3.000000 3.000000
#4  4.000000 4.000000
#5  3.500000 2.500000
#6  3.625000 2.875000
#7  3.531250 3.093750
#8  3.664062 3.117188
#   ...
数据
df1我们可以从
zoo

library(zoo)
for(i in 1:30) df1 <- rbind(df1, rollmeanr(tail(df1, 4), k = 4))
df1
#      Texas Colorado
#1  3.000000 1.000000
#2  4.000000 2.000000
#3  3.000000 3.000000
#4  4.000000 4.000000
#5  3.500000 2.500000
#6  3.625000 2.875000
#7  3.531250 3.093750
#8  3.664062 3.117188
#9  3.580078 2.896484
#10 3.600098 2.995605
#11 3.593872 3.025757
#12 3.609528 3.008759
#13 3.595894 2.981651
#14 3.599848 3.002943
#15 3.599785 3.004777
#16 3.601264 2.999533
#17 3.599198 2.997226
#18 3.600024 3.001120
#19 3.600068 3.000664
#20 3.600138 2.999636
#21 3.599857 2.999661
#22 3.600022 3.000270
#23 3.600021 3.000058
#24 3.600009 2.999906
#25 3.599977 2.999974
#26 3.600007 3.000052
#27 3.600004 2.999997
#28 3.599999 2.999982
#29 3.599997 3.000001
#30 3.600002 3.000008
#31 3.600000 2.999997
#32 3.600000 2.999997
#33 3.600000 3.000001
#34 3.600000 3.000001

或使用
累计

seq_len(30) %>%
    accumulate(.,  ~ .x %>% 
    slice(tail(row_number(), 4)) %>% 
    summarise_all(mean) %>%
    bind_rows(.x, .), .init = df1) %>%
    .[[30]]
#    Texas Colorado
#1  3.000000 1.000000
#2  4.000000 2.000000
#3  3.000000 3.000000
#4  4.000000 4.000000
#5  3.500000 2.500000
#6  3.625000 2.875000
#7  3.531250 3.093750
#8  3.664062 3.117188
#   ...
数据
df1您可以从R base使用
while
colMeans

while(nrow(df1)<=30){ 
  df1 <- rbind(df1, colMeans(tail(df1, 4)))
}
df1

       Texas Colorado
1  3.000000 1.000000
2  4.000000 2.000000
3  3.000000 3.000000
4  4.000000 4.000000
5  3.500000 2.500000
6  3.625000 2.875000
7  3.531250 3.093750
8  3.664062 3.117188
9  3.580078 2.896484
10 3.600098 2.995605
...

while(nrow(df1)您可以使用R base中的
while
colMeans

while(nrow(df1)<=30){ 
  df1 <- rbind(df1, colMeans(tail(df1, 4)))
}
df1

       Texas Colorado
1  3.000000 1.000000
2  4.000000 2.000000
3  3.000000 3.000000
4  4.000000 4.000000
5  3.500000 2.500000
6  3.625000 2.875000
7  3.531250 3.093750
8  3.664062 3.117188
9  3.580078 2.896484
10 3.600098 2.995605
...
while(nrow(df1)在基本R中,您可以执行以下操作:

 Reduce(function(x,y)rbind(x,colMeans(tail(x,4))),1:30, init = df)
      Texas Colorado
1  3.000000 1.000000
2  4.000000 2.000000
3  3.000000 3.000000
4  4.000000 4.000000
5  3.500000 2.500000
6  3.625000 2.875000
7  3.531250 3.093750
8  3.664062 3.117188
9  3.580078 2.896484
10 3.600098 2.995605
11 3.593872 3.025757
...
在base R中,您可以执行以下操作:

 Reduce(function(x,y)rbind(x,colMeans(tail(x,4))),1:30, init = df)
      Texas Colorado
1  3.000000 1.000000
2  4.000000 2.000000
3  3.000000 3.000000
4  4.000000 4.000000
5  3.500000 2.500000
6  3.625000 2.875000
7  3.531250 3.093750
8  3.664062 3.117188
9  3.580078 2.896484
10 3.600098 2.995605
11 3.593872 3.025757
...

有些地方不正确。虽然列的最后4行是3.5、3.5、3.5、3.5,但附加行的值为6.2。很抱歉,我是编程新手,无法参照您的代码检查它发生的原因。有些地方不正确。虽然列的最后4行是3.5、3.5、3.5、3.5,但附加行的值为6.2。很抱歉,我是编程新手“撞击”无法参照您的代码检查它发生的原因。我编造了这些数字,但此数据集已(季节性调整)1976年1月至2010年8月美国50个州的月失业率这不是我的专业领域,但我内心深处有一种挥之不去的怀疑,即可能应该使用某种时间序列预测来解决这个问题,也许是arima?我编造了这些数字,但这个数据集是(经季节性调整)1976年1月至2010年8月美国50个州的月失业率这不是我的专业领域,但我内心深处有一种挥之不去的怀疑,那就是这个问题可能应该用某种时间序列预测来解决,也许是arima?谢谢!工作得很好。我能问一下代码的逻辑吗抱歉,我是编程新手。代码正在做
df=colMeans(tail(df,4))
重复这30次。
tail(df,4)
只取数据帧的最后4行。
colMeans()
计算平均值。现在Reduce是一个forloop,使用以前的结果作为当前结果的输入。例如
Reduce(“+”,1:10)
简单的意思是加1+2,然后在结果中加3,然后再加4等等。要查看发生了什么,请使用
Reduce('+',1:10,acculate=TRUE)
也可以做
?Reduce
了解更多信息。然后
rbind(a,b)
用于绑定rowwiseUnderstand。函数(x,y)的用途是什么在rbind之前?在这种情况下y是什么?
Reduce
将函数作为第一个参数。即TRY
Reduce(函数(x,y)x+y,1:10,累加=TRUE)
。因此,在我的情况下,y将给出运行函数的次数,即1:30是我的yThank you!工作完美。我可以问一下代码的逻辑吗?我很抱歉,因为我是编程新手。代码正在执行
df=colMeans(tail(df,4))
重复这30次。
tail(df,4)
只取数据帧的最后4行。
colMeans()
计算平均值。现在Reduce是一个forloop,它使用以前的结果作为当前结果的输入。例如
Reduce(“+”,1:10)
只意味着添加1+2,然后向结果添加3,然后添加4等。要查看发生了什么,请使用
Reduce(“+”,1:10,accumultium=TRUE)
你也可以做
?Reduce
来了解更多信息。然后
rbind(a,b)
用于绑定rowwiseUnderstand。在rbind之前函数(x,y)的用途是什么?在这种情况下y是什么?
Reduce
将函数作为第一个参数。即TRY
Reduce(函数(x,y)x+y,1:10,accumulate=TRUE)
。在我的例子中,y将给出运行函数的次数,即1:30是我的y谢谢!只是我的df有300行,所以我必须精确地修改(nrow(df1)!你必须设置`(nrow(df1)谢谢!只有我的df有300行,所以我必须精确地修改(nrow(df1)!你必须设置`(nrow(df1)