【问题标题】:R: Replace 0s in the column by the numbers for Cohort AnalysisR:用队列分析的数字替换列中的 0
【发布时间】:2014-10-08 04:34:40
【问题描述】:

这个问题是我之前问题的延伸(点击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 提供的早期代码。但是没有成功。

关于如何进行的任何指示?蒂亚!!!

【问题讨论】:

  • 可能有更好的方法,但请在shifting columns in data frames 上查看此答案。您必须调整以升档而不是降档,但似乎它会起作用。
  • 让我试试。但我觉得如果我试图将所有行移动相同的数字,那会起作用。相反,我试图根据列和 0 的数量来改变它。 Month2 列向上移动 1 个空格。 Month3 列向上移动 2 个空格,依此类推……我可能需要做一个循环。感谢您的开始!
  • 是的,我假设你会遍历列。不过,看起来 akrun 在下面有更好的解决方案。
  • 为此使用rev 函数。无需循环
  • @RishiG 链接的问题中的一些非常聪明的答案,以及下面的答案。

标签: r analysis


【解决方案1】:

你可以试试:

  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

【讨论】:

  • @ssdecontrol 最近刚好想起一个类似问题的解决方案
  • 谢谢阿克伦!!这对我的实际数据进行了一些修改!
  • @akrun - 我对我之前的问题有一个扩展问题......对此有任何指示吗?提前致谢!
  • @akrun 知道了!愚蠢的语法错误!不过谢谢:)!
猜你喜欢
  • 2014-11-09
  • 1970-01-01
  • 2021-07-08
  • 1970-01-01
  • 2014-02-06
  • 2017-10-27
  • 2023-04-02
  • 2015-06-11
  • 1970-01-01
相关资源
最近更新 更多