na.locf()
包zoo中的功能在这里很有用,例如
require(zoo)
dat <- data.frame(ID = 1:5, sample_value = c(34,56,78,98,234),
log_message = c("FIRST_EVENT", NA, "SECOND_EVENT", NA, NA))
dat <-
transform(dat,
Current_Event = sapply(strsplit(as.character(na.locf(log_message)),
"_"),
`[`, 1))
给
> dat
ID sample_value log_message Current_Event
1 1 34 FIRST_EVENT FIRST
2 2 56 <NA> FIRST
3 3 78 SECOND_EVENT SECOND
4 4 98 <NA> SECOND
5 5 234 <NA> SECOND
为了解释代码,
na.locf(log_message)
返回一个因子(这是在 中创建数据的方式dat
),其中NA
s 替换为前一个非NA
值(最后一个结转部分)。
- 然后将 1. 的结果转换为字符串
strplit()
在此字符向量上运行,并在下划线处将其分开。strsplit()
返回一个包含与字符向量中的元素一样多的元素的列表。在这种情况下,每个分量都是长度为 2 的向量。我们想要这些向量的第一个元素,
- 所以我使用
sapply()
运行子集函数'['()
并从每个列表组件中提取第一个元素。
- 整个事情都包含在其中,
transform()
所以 i) 我不需要参考dat$
,因此我可以将结果作为新变量直接添加到数据dat
中。