此问题是对我之前问题的延伸(点击here)
我将数据转换为以下格式:
我希望我的数据采用以下格式:
请注意,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!
答案 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