如何在R中基于带有模式和序列的行添加新列?

时间:2018-10-16 00:37:37

标签: r conditional-statements mutate

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

我要创建一个新列,条件是如果它发现一行包含以单词“ 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"))

我尝试对循环,子集和联接数据帧进行许多操作,但均未成功。我无法在R中的指令中弄清楚这种模式。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

希望这对您的数据有用:

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