R

时间:2017-10-04 14:51:11

标签: r loops dataframe foreach merge

我有以下样本类型的数据框,其中包含许多行和列。我需要取前面行的平均值,并将其添加到另一列中,并在R中使用循环。

输入:

MA1 MA2 MA3 MA4 MA5
4.0 0.2 0.2 0.2 0.2
3.0 4.0 0.2 3.0 0.2
0.2 0.2 0.2 0.2 0.2
0.2 4.0 1.0 0.2 2.0
0.2 0.2 0.2 3.0 0.2
5.0 4.0 0.2 0.2 0.2
0.2 0.2 0.2 3.0 0.2

输出:

MA1 MA2 MA3 MA4 MA5  MA6 MA7  MA8  MA9  MA10 MA11
4.0 0.2 0.2 0.2 0.2 2.80 2.80 2.80 2.80 2.80 2.80
3.0 4.0 0.2 3.0 0.2 2.09 2.09 2.09 2.09 2.09 2.09
0.2 0.2 0.2 0.2 0.2 0.22 0.22 0.22 0.22 0.22 0.22
0.2 4.0 1.0 0.2 2.0 1.49 1.49 1.49 1.49 1.49 1.49
0.2 0.2 0.2 3.0 0.2 0.78 0.78 0.78 0.78 0.78 0.78
5.0 4.0 0.2 0.2 0.2 1.93 1.93 1.93 1.93 1.93 1.93
0.2 0.2 0.2 3.0 0.2 0.78 0.78 0.78 0.78 0.78 0.78

这里MA6应该是从MA1到MA5的平均列值          MA7应该是从MA1到MA6的平均列值等等......任何人都可以帮我解决这个问题

1 个答案:

答案 0 :(得分:1)

rowMeans在这里不是一个很好的例子,因为你的值在第一次迭代后不会改变,但是试试这个递归函数

您的数据

df <- read.table(text="MA1 MA2 MA3 MA4 MA5
4.0 0.2 0.2 0.2 0.2
3.0 4.0 0.2 3.0 0.2
0.2 0.2 0.2 0.2 0.2
0.2 4.0 1.0 0.2 2.0
0.2 0.2 0.2 3.0 0.2
5.0 4.0 0.2 0.2 0.2
0.2 0.2 0.2 3.0 0.2", header=TRUE)

递归函数

myfun <- function(df, N, counter) {
            require(dplyr)
            if (counter > N) {
                return(df)  # return value once number of iterations is fulfilled
            } else {
                new.df <- df %>% 
                        mutate(new = rowMeans(.)) %>%  # modify data frame
                        rename_at(vars("new"), funs(paste0("MA", ncol(df)+1)))  # rename new column
                myfun(new.df, N, counter+1)  # recursive, calls function again but with modified data frame
            }
         }

myfun(df, N=5, counter=1)

  # MA1 MA2 MA3 MA4 MA5  MA6  MA7  MA8  MA9 MA10
# 1 4.0 0.2 0.2 0.2 0.2 0.96 0.96 0.96 0.96 0.96
# 2 3.0 4.0 0.2 3.0 0.2 2.08 2.08 2.08 2.08 2.08
# 3 0.2 0.2 0.2 0.2 0.2 0.20 0.20 0.20 0.20 0.20
# 4 0.2 4.0 1.0 0.2 2.0 1.48 1.48 1.48 1.48 1.48
# 5 0.2 0.2 0.2 3.0 0.2 0.76 0.76 0.76 0.76 0.76
# 6 5.0 4.0 0.2 0.2 0.2 1.92 1.92 1.92 1.92 1.92
# 7 0.2 0.2 0.2 3.0 0.2 0.76 0.76 0.76 0.76 0.76