我有一个数据框测试,如下所示:
ID Month1 Month2 Month3 Month4 Month5 Month6 Month7 Month8
A 0 1 1 1 1 0 0 0
B 0 1 1 1 0 0 NA NA
C 0 0 0 0 NA NA NA NA
D 0 1 1 1 1 1 1 1
E 0 1 1 0 0 0 1 1
F 0 0 0 1 1 1 1 1
G 0 0 1 1 0 0 0 0
H 0 0 0 0 0 0 0 0
我想在数据框中创建一个条件变量“Result”,用于计算 1 连续重复的次数。但是,我只想计算后面跟着 0 的第一组 1,这意味着在创建“Result”变量时我需要记住三个条件。 条件如下:
条件1: 计算以 0 结尾的第一组 1。
条件2: 如果这组 1 不以 0 结尾或以 NA 结尾,则 Result=NA
条件3 如果有两组以 0 结尾的 1,则忽略第二组。
ID Month1 Month2 Month3 Month4 Month5 Month6 Month7 Month8 Result
A 0 1 1 1 1 0 0 0 4
B 0 1 1 1 0 0 NA NA 3
C 0 0 0 0 NA NA NA NA 0
D 0 1 1 1 1 1 1 1 NA
E 0 1 1 0 0 0 1 1 2
F 0 0 0 1 1 1 1 1 NA
G 0 0 1 1 0 0 0 0 2
H 0 0 0 0 0 0 0 0 0
到目前为止我已经尝试过:
test$Result=apply(test[,c(2:9)],1,function(x) length(x[x==1&!(is.na(x))]))
这会计算行中 1 的总数,而不仅仅是第一组 1。
任何和所有的帮助将不胜感激。
最佳答案
我认为使用rle()
来计算“值运行的长度”在这里会很有帮助。以下是我假设您的数据存储在 R 中的方式
dd <- structure(list(ID = structure(1:8, .Label = c("A", "B", "C",
"D", "E", "F", "G", "H"), class = "factor"), Month1 = c(0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L), Month2 = c(1L, 1L, 0L, 1L, 1L, 0L, 0L,
0L), Month3 = c(1L, 1L, 0L, 1L, 1L, 0L, 1L, 0L), Month4 = c(1L,
1L, 0L, 1L, 0L, 1L, 1L, 0L), Month5 = c(1L, 0L, NA, 1L, 0L, 1L,
0L, 0L), Month6 = c(0L, 0L, NA, 1L, 0L, 1L, 0L, 0L), Month7 = c(0L,
NA, NA, 1L, 1L, 1L, 0L, 0L), Month8 = c(0L, NA, NA, 1L, 1L, 1L,
0L, 0L)), .Names = c("ID", "Month1", "Month2", "Month3", "Month4",
"Month5", "Month6", "Month7", "Month8"), class = "data.frame",
row.names = c(NA, -8L))
然后我会运行类似的代码
dd$Result <- apply(dd[, -1], 1, function(x) {
rr<-rle(x)
f1<-which(rr$values==1)[1]
if ( is.na(f1) ) {
0
} else if (!is.na(rr$values[f1+1]) && rr$values[f1+1]==0) {
rr$lengths[f1]
} else {
NA
}
})
这给出了
ID Month1 Month2 Month3 Month4 Month5 Month6 Month7 Month8 Result
1 A 0 1 1 1 1 0 0 0 4
2 B 0 1 1 1 0 0 NA NA 3
3 C 0 0 0 0 NA NA NA NA 0
4 D 0 1 1 1 1 1 1 1 NA
5 E 0 1 1 0 0 0 1 1 2
6 F 0 0 0 1 1 1 1 1 NA
7 G 0 0 1 1 0 0 0 0 2
8 H 0 0 0 0 0 0 0 0 0
如您所愿。
确实有一些边缘情况使这段代码有些棘手。首先我们要看看有没有1;如果不是,我们返回 0。然后,如果有一个 1,我们要确保它后面跟着一个 0,否则返回 NA
。我们使用 apply()
对每一行执行此逻辑,省略 ID 列。从您的描述中并不完全清楚如果 NA
值出现在行末尾之前(如开头),会发生什么情况,所以我只是假设这是您不必这样做的情况担心。
关于R- 创建一个以行值为条件的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25754051/