代码之家  ›  专栏  ›  技术社区  ›  ajax2000

基于R中现有列中的组创建新列

  •  2
  • ajax2000  · 技术社区  · 7 年前

    我正在清理R中的一些数据,并有这样一个数据集:

    x1, x2, x3
    1, 24, 41
    1, 22, 40
    1, 21, 38
    2, 20, 40
    2, 21, 40
    3, 22, 41
    3, 24, 40
    4, 20, 41
    

    我想添加一个新列,每行的值都基于x1和x2列。在x1中的每个组中,我想知道x2中的值是否大于或等于,比如24。如果为true,则该组的新列中的所有值都设置为1。

    所以数据应该是这样的:

    x1, x2, x3, x4
    1, 24, 41, 1
    1, 22, 40, 1
    1, 21, 38, 1
    2, 20, 40, 0
    2, 21, 40, 0
    3, 22, 41, 1
    3, 24, 40, 1
    4, 20, 41, 0
    

    其目的是聚合行。我想根据x1中的组聚合数据,但仍然需要其他列的信息。

    2 回复  |  直到 7 年前
        1
  •  3
  •   akrun    7 年前

    这里有一个选项 base R

    df1$x4 <- table(df1$x1, df1$x2 >=24)[,2][df1$x1]
    

    或与 dplyr

    library(dplyr)
    df1 %>%
       group_by(x1) %>%
       mutate(x4 = as.integer(any(x2 >=24))) 
    
        2
  •  1
  •   acylam    7 年前

    与@akrun的答案类似,这里是 data.table 等效值:

    library(data.table)
    
    setDT(df)[, x4 := any(x2>=24)*1, by=x1]
    

    结果:

       x1 x2 x3 x4
    1:  1 24 41  1
    2:  1 22 40  1
    3:  1 21 38  1
    4:  2 20 40  0
    5:  2 21 40  0
    6:  3 22 41  1
    7:  3 24 40  1
    8:  4 20 41  0
    

    数据:

    df = structure(list(x1 = c(1L, 1L, 1L, 2L, 2L, 3L, 3L, 4L), x2 = c(24L, 
    22L, 21L, 20L, 21L, 22L, 24L, 20L), x3 = c(41L, 40L, 38L, 40L, 
    40L, 41L, 40L, 41L)), .Names = c("x1", "x2", "x3"), class = "data.frame", row.names = c(NA, 
    -8L))