引用单元格中的先前值(R)

时间:2015-12-01 10:07:21

标签: r vector reference dataframe

我有以下data.frame:

head(data.c)

     mark high_mark mark_cum
      5        0        0
      7        1        1
      7        1        2
      NA       0        2
      7        1        3
      7        1        4

由于存在NA,我需要从1:length(mark)构建正常序列的附加列。但是,如果是NA矢量单元必须采用先前的值。所以看起来应该是这样的:

     mark high_mark mark_cum mark_seq
      5        0        0       1 
      7        1        1       2
      7        1        2       3
      NA       0        2       3 
      7        1        3       4
      7        1        4       5
      NA       0        4       5

1 个答案:

答案 0 :(得分:1)

1)cumsum 此解决方案使用的事实是每个mark_seq元素等于此时mark中非NA元素的累计数量。

transform(data.c, mark_seq = cumsum(!is.na(mark)))

,并提供:

  mark high_mark mark_cum mark_seq
1    5         0        0        1
2    7         1        1        2
3    7         1        2        3
4   NA         0        2        3
5    7         1        3        4
6    7         1        4        5
7   NA         0        4        5


data.c <- read.table(text = Lines, header = TRUE)

2)na.locf 以下是使用seq_alongna.locf(来自动物园)的第二个解决方案。它创建的序列长度与mark中非NA元素的数量相同,并使用replace将它们放在非NA元素存在的位置。然后na.locf用于填充具有先前值的NA。

library(zoo)

transform(data.c, mark_seq=na.locf(replace(mark, !is.na(mark), seq_along(na.omit(mark)))))

3)mark_cum 问题中没有说明输入列mark_cum是如何构建的,但在问题的示例输出中,mark_seq列等于{{ 1}}列加1如果总是如此,那么一个简单的解决方案是:

mark_cum

注意:我们将此作为输入:

transform(data.c, mark_seq = mark_cum + 1)