代码之家  ›  专栏  ›  技术社区  ›  NelsonGon phoxis

沿循环中的列移动

  •  0
  • NelsonGon phoxis  · 技术社区  · 5 年前

    我正在尝试使用以下数据创建此函数:

    df<-read.table(text="x    y
    0    1000
    0    1000
    4    1000
    2    1000
    10   1000
    5    1000",header=T)
    

    目的是得到x和y列的累积差。目前我得到的x值有一个错误:

    1:在mrowdiff[i]<-df[i+1,]-df[i,]中: 要替换的项目数不是替换长度的倍数

    我认为这与第二栏的内容无关。我试过让它发挥作用,但不幸的是失败了:

    rowdiff<-function(df,na.rm=F){
      mrowdiff<-numeric(nrow(df))
      for(i in 1:nrow(df))
    
        {
       mrowdiff[i]<-df[i+1,]-df[i,]
       if(na.rm==T){
         mrowdiff<- mrowdiff[!is.na(mrowdiff)]
      }
    
      }
    do.call(rbind,mrowdiff)
    }
    

    电流输出: 行差(df,na.rm=t)

        [,1]
    [1,]    0
    [2,]    4
    [3,]   -2
    [4,]    8
    [5,]   -5
    

    我希望有第二列0。

    2 回复  |  直到 5 年前
        1
  •  1
  •   Joseph Clark McIntyre    5 年前

    以下是您可以进行的一些更改。以下是完整的功能:

    rowdiff<-function(df,na.rm=F){
    > mrowdiff <- df # you want mrowdiff to have the same basic structure as df, so start with making it equal to df (there are more efficient ways to do this)
    > for(i in 1:nrow(df))
    + {
    +     mrowdiff[i, ]<-df[i+1, ]-df[i, ] # calculate differences for both rows at once
    +     }
    > mrowdiff<- na.omit(mrowdiff) # remove missing values
    > mrowdiff # there's nothing to rbind, since you've been working with a dataframe all along
      }
    
    rowdiff(df)
       x y
    1  0 0
    2  4 0
    3 -2 0
    4  8 0
    5 -5 0
    
        2
  •  1
  •   shwan    5 年前

    这是一种避免使用函数的简单方法,尽管您提到…

    for (j in 1:ncol(df)) {
        df[,paste0("rowdiff",j)] <- NA
        for (i in 2:nrow(df)) {
            df[i,paste0("rowdiff",j)] <- df[i,j] - df[i-1,j]
        }   
    }
    

    输出:

    > df
       x    y rowdiff1 rowdiff2
    1  0 1000       NA       NA
    2  0 1000        0        0
    3  4 1000        4        0
    4  2 1000       -2        0
    5 10 1000        8        0
    6  5 1000       -5        0