R- 创建一个以行值为条件的变量

标签 r conditional-statements

我有一个数据框测试,如下所示:

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/

相关文章:

r - 如何删除在 R 中使用 png() 创建的图像周围的边距

r - 为什么 RStudio 中的 ifelse 中的英语函数不起作用?

loops - VBA Do Until 循环或 ""条件

R - 选择满足多个条件的矩阵行的最快方法

c++ - 为 pthreads 动态创建 2 个条件变量

R foreach并行找不到全局函数

r - 列长度​​的mutate_impl中的R错误

rbind 矩阵列表中的矩阵

php - 在 PHP 中定位特定版本的 Internet Explorer

mysql - 根据条件垂直拆分表