2016-04-02 11 views
0

私は数えたい特定の音声パターンを持っています。コラム1の俳優とコラム2の文章のタイプがあります。私はIRF/IREという会話パターンをプログラム的に特定したいと思っています。パターンはこれです:複数行と列のパターンの出現をカウントします

  • I - >教師
  • R問い尋ねる - (通常答えを)>学生が応答を
  • F/E - >教師が評価されるか、生徒の解答
  • にフィードバックを与えます

私は、1欄の教師 - 生徒先生を探していますか? - [。!] - [?。]に対応しています。

したがって、次の行を以下の偽のデータでは、このパターンを満たすとカウント:

33 Teacher ? 
34 Student . 
35 Teacher . 

私はこのデータを視覚的に検査しました。どのように私は、基本的に以下の行列パターンが何であるかを見つけることができる:

| Teacher | ? |  
| Student | [.!] |  
| Teacher | [?!.] | 

それは物事が速く/容易になります場合、私は、任意の外部のパッケージに開いています。

n <- 100 
set.seed(10) 
dat <- data.frame(
    actor = sample(c("Teacher", "Student"), n, TRUE, c(.6, .4)), 
    type = c(sample(c('?', '.', '!'), n, TRUE, c(.3, .5, .1))) 
) 

head(dat) 

##  actor type 
## 1 Teacher . 
## 2 Teacher . 
## 3 Teacher . 
## 4 Student . 
## 5 Teacher ! 
## 6 Teacher ? 
## . 
## . 
## . 

答えて

1

ここのみ基地R索引付け、比較、および論理演算を用いたアプローチは次のとおり

hits <- which(
     dat$actor[-seq(nrow(dat),by=-1L,len=2L)]=='Teacher' 
    & dat$type [-seq(nrow(dat),by=-1L,len=2L)]=='?' 
    & dat$actor[-c(1L,nrow(dat))]=='Student' 
    & dat$type [-c(1L,nrow(dat))]%in%c('.','!') 
    & dat$actor[-1:-2]=='Teacher' 
    & dat$type [-1:-2]%in%c('?','!','.') 
); 
hits; 
## [1] 33 51 95 
dat[rep(hits,each=3L)+0:2,]; 
##  actor type 
## 33 Teacher ? 
## 34 Student . 
## 35 Teacher . 
## 51 Teacher ? 
## 52 Student . 
## 53 Teacher . 
## 95 Teacher ? 
## 96 Student . 
## 97 Teacher ? 

Iをパラメータ化する溶液を一般比較演算子を関数のリストとして、オペランドをリストの列のdata.frameとして指定します。ターゲット列:

dfmatch <- function(df,operands,preds=rep(list(`%in%`),length(operands))) { 
    preds <- as.list(preds); 
    operands <- as.data.frame(operands); 
    if (length(preds)!=ncol(operands)) stop('length(preds)!=ncol(operands).'); 
    predLen <- length(preds); 
    rowLen <- nrow(operands); 
    if (rowLen>nrow(df)) return(integer()); 
    which(Reduce(`&`,lapply(seq_len(predLen),function(opi) { 
     pred <- preds[[opi]]; 
     Reduce(`&`,lapply(seq_len(rowLen),function(ri) { 
      operand <- operands[[opi]][[ri]]; 
      pred(df[[names(operands[opi])]][-c(seq(1L,len=ri-1L),seq(nrow(df),by=-1L,len=rowLen-ri))],operand); 
     })); 
    }))); 
}; ## end dfmatch() 

operands <- data.frame(actor=I(list('Teacher','Student','Teacher')),type=I(list('?',c('.','!'),c('?','!','.')))); 
operands; 
##  actor type 
## 1 Teacher  ? 
## 2 Student ., ! 
## 3 Teacher ?, !, . 
dfmatch(dat,operands); 
## [1] 33 51 95 
0

ここに1つのアプローチは次のとおり

if (!require("pacman")) install.packages("pacman") 
pacman::p_load(dplyr, zoo) 

dat2 <- dat %>% 
    mutate(
     combo = paste0(actor, type) 

    ) 


patterns <- expand.grid(
    paste0('Teacher', '?'),  
    paste0('Student', c('.', '!')), 
    paste0('Teacher', c('.', '!', '?')) 
) 

locs <- apply(patterns, 1, function(x){ 
    with(dat2, which(rollapply(combo, 3, identical, unname(unlist(x, use.names=FALSE))))) 
}) 

lapply(unlist(locs[sapply(locs, length) > 0]), function(i) { 
    dat2[i:(i+2),] 
}) 

## [[1]] 
##  actor type combo 
## 33 Teacher ? Teacher? 
## 34 Student . Student. 
## 35 Teacher . Teacher. 
## 
## [[2]] 
##  actor type combo 
## 51 Teacher ? Teacher? 
## 52 Student . Student. 
## 53 Teacher . Teacher. 
## 
## [[3]] 
##  actor type combo 
## 95 Teacher ? Teacher? 
## 96 Student . Student. 
## 97 Teacher ? Teacher? 

length(unlist(locs[sapply(locs, length) > 0])) 

## 3 
関連する問題