【问题标题】:How to add a new column based on rows with a pattern and a sequence in R?如何根据 R 中具有模式和序列的行添加新列?
【发布时间】:2019-03-20 10:54:48
【问题描述】:

如果有一个数据框,其列的模式为:一行带有一个带有名称的字符串,然后是其他包含名称和数字序列的行。这在整个数据帧中重复。

我想创建一个新列,条件是如果它发现一行的字符串以单词“CANTON”开头(并且没有数字),复制没有第一个单词(CANTON)的字符串通过所有新列的下一行,直到出现另一行,其中包含以单词“CANTON”开头的字符串,它必须采用新字符串,并将新的最后一个单词复制到新列中。

数据框的一个例子是下一个:

datos <- data.frame(sitio = c("CANTON SAN JOSE", "01 Carmen", "02 Merced", 
      "03 Hospital", "04 Catedral", "05 San Franscisco", 
      "CANTON ESCAZU", "01 Escazu", "02 San Antonio", "03 San Rafael" ),
      area = c(44.62, 1.49, 2.29, 3.38, 2.31, 2.85, 34.49, 4.38,
               16.99, 13.22))
datos

预期的结果是:

expected_result <-data.frame(
      sitio = c("CANTON SAN JOSE", "01 Carmen", "02 Merced",
                "03 Hospital", "04 Catedral", "05 San Franscisco", 
                "CANTON ESCAZU", "01 Escazu", "02 San Antonio", 
                "03 San Rafael" ),
      area = c(44.62, 1.49, 2.29, 3.38, 2.31, 2.85, 34.49, 4.38,
               16.99, 13.22),
      canton = c("SAN JOSE", "SAN JOSE", "SAN JOSE", "SAN JOSE", 
                 "SAN JOSE", "SAN JOSE", "ESCAZU", "ESCAZU", "ESCAZU",
                 "ESCAZU"))

我尝试了很多 for 循环、子集和连接数据帧,但都没有成功。我无法在 R 的指令中阐明这种模式。

感谢您的帮助!

【问题讨论】:

    标签: r conditional-statements dplyr


    【解决方案1】:

    希望这适用于您的数据:

    x <- gsub('^CANTON ', '', datos$sitio)
    x[!grepl('^CANTON ', datos$sitio)] <- NA
    datos$canton <- ave(x, cumsum(!is.na(x)), FUN = function(xx) xx[1])
    
    # > datos
    #                sitio  area   canton
    # 1    CANTON SAN JOSE 44.62 SAN JOSE
    # 2          01 Carmen  1.49 SAN JOSE
    # 3          02 Merced  2.29 SAN JOSE
    # 4        03 Hospital  3.38 SAN JOSE
    # 5        04 Catedral  2.31 SAN JOSE
    # 6  05 San Franscisco  2.85 SAN JOSE
    # 7      CANTON ESCAZU 34.49   ESCAZU
    # 8          01 Escazu  4.38   ESCAZU
    # 9     02 San Antonio 16.99   ESCAZU
    # 10     03 San Rafael 13.22   ESCAZU
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-25
      • 2021-07-27
      • 1970-01-01
      相关资源
      最近更新 更多