【问题标题】:Adding index depend on variable in other column in a dataframe in R?添加索引取决于R中数据框中其他列中的变量?
【发布时间】:2018-07-19 14:04:30
【问题描述】:

这是我的数据框:

structure(list(a = c(1, 1, -1, 1, 1, 1, -1, 1, 1, 1, 1)), .Names = "a", row.names = c(NA, 
-11L), class = c("tbl_df", "tbl", "data.frame"))

现在我想添加一个标识列,其作用类似于索引:

我的意思是我想添加一个从 id = 1 开始的列,每次有 -1 将其设置为 id = 2 等等: 预期:

structure(list(a = c(1, 1, -1, 1, 1, 1, -1, 1, 1, 1, 1), b = c(1, 
1, 2, 2, 2, 2, 3, 3, 3, 3, 3)), .Names = c("a", "b"), row.names = c(NA, 
-11L), class = c("tbl_df", "tbl", "data.frame"))

使用来自R add index column to data frame based on row values的解决方案 不能满足我的需要。

【问题讨论】:

    标签: r indexing dplyr


    【解决方案1】:

    你也可以这样做。只需cumsuma==-1 创建的逻辑向量并将其结果加一即可:

    library(dplyr)
    
    df1 %>%
      mutate(b = cumsum(a == -1) + 1)
    

    或使用 Base R:

    df1$b = cumsum(df1$a == -1) + 1
    

    结果:

    # A tibble: 11 x 2
           a     b
       <dbl> <dbl>
     1     1     1
     2     1     1
     3    -1     2
     4     1     2
     5     1     2
     6     1     2
     7    -1     3
     8     1     3
     9     1     3
    10     1     3
    11     1     3
    

    数据:

    df1 = structure(list(a = c(1, 1, -1, 1, 1, 1, -1, 1, 1, 1, 1)), .Names = "a", row.names = c(NA, 
    -11L), class = c("tbl_df", "tbl", "data.frame"))
    

    【讨论】:

    • 如果我错了,请纠正我,cumsum 将对 -1 的出现求和并保持不变,直到另一个 -1 出现使 idx 被 1 增大? @user
    • @steves 正确。当a==-1FALSEa != -1a==-1 创建一个逻辑向量TRUE。当您对其应用cumsum 时,它以0 开头,因为第一行不是-1,并且只有在遇到TRUE 时才会添加一个。由于您希望 b 以 1 开头,因此我将 1 添加到向量中,因此所有值都增加了 1
    【解决方案2】:

    你可以这样做:

    1. 创建一个新的帮助列,第一行的值为1,每次有-1

    2. 使用cumsum 函数创建index 列并删除辅助列

      library(dplyr)
      
      df %>%
        mutate(helper = ifelse(row_number()==1, 1, 
          ifelse(a == -1, 1, 0))) %>% 
        mutate(index = cumsum(helper)) %>%
        select(-helper)
      

    【讨论】:

    • 太棒了!简单,天才直 2 点!
    猜你喜欢
    • 2013-08-22
    • 2021-06-17
    • 1970-01-01
    • 2023-04-02
    • 2020-07-04
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多