извлечение данных из двух столбцов - PullRequest
1 голос
/ 02 июля 2019

У меня есть фрейм данных, который выглядит следующим образом. Это относится к словам и их структуре

df <- data.frame(word = c("pokkoitta", "demna", "ningatinggo ", "tengkeam", "bampana", "njam"), structure = c("CvC:vvC:v", "CvCCv", "CvCvCvNCv", "CvNCvvC", "CvNCvCv" , "NCvC"))

Во втором столбце указывается структура первого столбца. Если во втором столбце встречается комбинация C :, NC или CC, мне нужно извлечь из первого столбца, к которому они относятся.

Так что мне нужно:

kk C: kk C: mn CC ngg NC ngk NC mp NC nj NC Одна вещь, которая должна быть принята во внимание, - то, что простой счет не работает на 2 буквы в левом столбце, которые соответствуют 1 букве в правом столбце, а именно ng | sy | kh = C (не CC, поскольку они представляют одна фонема) Также, одним словом, может встречаться более одной из этих комбинаций

Thx

Обновление:

Это будет соответствующий шаблон с регулярным выражением:

(nj|ngk|ngg|nc|nt|nd|mp|mb) = NC
(ng|sy|kh) = C    
[b-df-hj-np-tv-xz])\\1+) = C:
([b-df-hj-np-tv-z]) = C
(') = :    
((a|e|i|o|u)\\1+) = v:    
(a|e|i|o|u)  = v     

1 Ответ

0 голосов
/ 02 июля 2019

Интересная проблема. Возможно, я только что изобрел алгоритм, используемый для поиска этих структур, но, похоже, он работает.

df <- data.frame(
  word=c("pokkoitta", "demna", "ningatinggo", "tengkeam", "bampana", "njam"),
  structure=c("CvC:vvC:v", "CvCCv", "CvCvCvNCv", "CvNCvvC", "CvNCvCv", "NCvC"),
  stringsAsFactors=FALSE)

pat <- data.frame(str=c("NC", "C", "C:", "C", "v:", "v"),
                  rex=c("nj|ngk|ngg|nc|nt|nd|mp|mb",
                        "ng|sy|kh",
                        "([b-df-hj-np-tv-xz])\\1+",
                        "[b-df-hj-np-tv-z]",
                        "(a|e|i|o|u)\\1+",
                        "a|e|i|o|u"), stringsAsFactors=FALSE)

xs <- xw <- df[,1]
for (i in 1:nrow(pat)) {
    rx <- gregexpr(pat[i, 2], xs)
    mc <- regmatches(xs, rx)
    mp <- sapply(mc, function(x) format(paste("", x), width=6))
    mc[lengths(mc) != 0] <- mp[lengths(mc) != 0]
    regmatches(xw, rx) <- mc
    regmatches(xs, rx) <- paste("", format(pat[i, 1], width=5))
}

phon <- trimws(cbind(word=xw, structure=xs))
phon <- apply(phon, 1, strsplit, " +")
phon <- lapply(phon, function(x) do.call(cbind, x))
head(phon, 3)
# [[1]]
#      word structure
# [1,] "p"  "C"      
# [2,] "o"  "v"      
# [3,] "kk" "C:"     
# [4,] "o"  "v"      
# [5,] "i"  "v"      
# [6,] "tt" "C:"     
# [7,] "a"  "v"      
# 
# [[2]]
#      word structure
# [1,] "d"  "C"      
# [2,] "e"  "v"      
# [3,] "m"  "C"      
# [4,] "n"  "C"      
# [5,] "a"  "v"      
# 
# [[3]]
#      word  structure
# [1,] "n"   "C"      
# [2,] "i"   "v"      
# [3,] "ng"  "C"      
# [4,] "a"   "v"      
# [5,] "t"   "C"      
# [6,] "i"   "v"      
# [7,] "ngg" "NC"     
# [8,] "o"   "v"      
...