R:用队列分析的数字替换列中的0

时间:2014-09-17 16:10:20

标签: r analysis

此问题是对我之前问题的延伸(点击here

我将数据转换为以下格式: Before

我希望我的数据采用以下格式:

After

请注意,Month2列第一行中的0将替换为Month2列第二行中的9。类似地,在Month3列中,0被替换为来自下面行的数字

我希望实现的是将每列中的数字从较低行移动到顶行以替换0

非常感谢任何帮助! :)

修改 我有与上面类似的数据集,但0位于不同的位置:

    x <- cbind(x1 = 10:17, x2 = c(4:1, 2:5),x3 = 21:28,x4 = 31:38, x5 = 41:48)
    x[][lower.tri(x[])] <- 0

 x1 x2 x3 x4 x5
 10  4 21 31 41
  0  3 22 32 42
  0  0 23 33 43
  0  0  0 34 44
  0  0  0  0 45
  0  0  0  0  0
  0  0  0  0  0
  0  0  0  0  0

我正在寻找输出如下:

 x1 x2 x3 x4 x5
 10  4 21 31 41
  3 22 32 42  0
 23 33 43  0  0
 34 44  0  0  0
 45  0  0  0  0
  0  0  0  0  0
  0  0  0  0  0
  0  0  0  0  0

我尝试修改@akrun提供的早期代码。但是没有成功。

关于如何去做的任何指示? TIA!

1 个答案:

答案 0 :(得分:3)

你可以尝试:

  apply(dat[,-(1:2)], 2, FUN=function(x) c(x[!!x],x[!x]) )
  #     Month2 Month3 Month4 Month5 Month6
  #[1,]      9      7      6      4      0
  #[2,]      9      5      3      0      0
  #[3,]      7      6      0      0      0
  #[4,]      8      0      0      0      0
  #[5,]      0      0      0      0      0

要保持data.frame完整,最好使用lapply。通常,如果列具有不同的类,则使用apply会将其强制转换为矩阵,并且通常会获得单个class。在这里,它无关紧要,因为列都是数字。不过,我更喜欢lapply

 dat[,-(1:2)] <- lapply(dat[,-(1:2)], function(x) c(x[!!x], x[!x]))
 dat
 #   Month_Start_Date Month1 Month2 Month3 Month4 Month5 Month6
 #1       2010-01-01     10      9      7      6      4      0
 #2       2010-02-01     10      9      5      3      0      0
 #3       2010-03-01     10      7      6      0      0      0
 #4       2010-04-01     10      8      0      0      0      0
 #5       2010-05-01     10      0      0      0      0      0