我有以下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
答案 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_along
和na.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)