【问题标题】:Substract one element from another in next row but different column?在下一行但不同的列中从另一个元素中减去一个元素?
【发布时间】:2014-09-21 14:59:49
【问题描述】:

基本上,我正在寻找一个适用于数据帧的 diff() 函数,它可以从第 n+1 行中的另一个元素中减去第 n 行中的一个元素,但它也在另一列中。

所以,使用数据框:

> df = data.frame(X=c("x1","x2","x3"), Y=c("y1","y2","y3"))
   X  Y
1 x1 y1
2 x2 y2
3 x3 y3

我想做df$Z=df$Y-df$Z,但有一个“滞后”,所以我得到:

> df$Z
[1] NULL y2-x1 y3-x2

当然,如果不使用循环,我在 R 中从未见过如此缓慢的事情......

【问题讨论】:

    标签: r


    【解决方案1】:

    现在知道为什么必须在示例中使用字符值使事情变得困难,但是

    c(NA, with(df, paste(tail(Y,-1), head(X,-1), sep="-")))
    

    显示您要执行的减法运算。如果数据实际上是数字

    df$Z <- c(NA, with(df, tail(Y,-1) - head(X,-1)))
    

    应该做的伎俩

    【讨论】:

      【解决方案2】:

      尝试(您显示了一些因子列而不是数值)。如果列是数字,

       df$Z <- c(NA,df$Y[-1]- df$X[-nrow(df)])
      

      或使用with

       df$Z <-   with(df, c(NA,Y[-1]- X[-length(X)]))
      

      说明

      对于提供的数据

       df$Y[-1]  #removes the first observation
       #[1] y2 y3
       #Levels: y1 y2 y3
       df$X[-nrow(df)] #removes the last observation
       #[1] x1 x2
       #Levels: x1 x2 x3
      

      所以,当我们取差时,它将是y2-x1y3-x2

      【讨论】:

      • 很好,我很难理解逻辑,但基本上你只需删除 X 和 Y 中的一行,这样向量就会按照我们想要的方式重合。
      • @Wicelo 是的,我应该添加一些解释。对于X,它是被移除的最后一行或元素。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-13
      • 1970-01-01
      • 1970-01-01
      • 2020-03-19
      • 2019-01-08
      • 1970-01-01
      相关资源
      最近更新 更多