如果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中的指令中弄清楚这种模式。
感谢您的帮助!
答案 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