R在特定字符串下的行的子集范围

时间:2018-06-25 22:26:46

标签: r

我在R中有以下形状的几个数据框:

> pos.sentence
   doc_id token_id   token   pos
1      d1        1      Ik  PRON
2      d1        2    weet  VERB
3      d1        3     dat SCONJ
4      d1        4     jij  PRON
5      d1        5     dat SCONJ
6      d1        6     wil   AUX
7      d1        7      en CCONJ
8      d1        8      ik  PRON
9      d1        9     heb   AUX
10     d1       10     het   DET
11     d1       11      al   ADV
12     d1       12 gekocht  VERB

我想做的是创建数据的子集,其中收集从PRON(出现在pos列中)到下一个PRON实例的所有行。因此,在这种情况下,将导致三个单独的子集/数据帧:

   doc_id token_id   token   pos
1      d1        1      Ik  PRON
2      d1        2    weet  VERB
3      d1        3     dat SCONJ

   doc_id token_id   token   pos
4      d1        4     jij  PRON
5      d1        5     dat SCONJ
6      d1        6     wil   AUX
7      d1        7      en CCONJ

   doc_id token_id   token   pos
8      d1        8      ik  PRON
9      d1        9     heb   AUX
10     d1       10     het   DET
11     d1       11      al   ADV
12     d1       12 gekocht  VERB

有人知道这样做的方法吗?用作输入的数据帧的大小各不相同,因此我无法在行号的基础上创建子集。

1 个答案:

答案 0 :(得分:0)

这个怎么样?首先,确定组成员身份:

library(tidyverse)
z <- posdata %>% mutate(ispron=(1*(pos=="PRON"))) %>% 
    mutate(group=cumsum(c(1, sign(diff(ispron)) > 0)))

网络,分为多个对象:

> split(z,z$group) 
$`1`
# A tibble: 3 x 6
  doc_id token_id token pos   ispron group
  <fct>     <int> <fct> <fct>  <dbl> <dbl>
1 d1            1 Ik    PRON      1.    1.
2 d1            2 weet  VERB      0.    1.
3 d1            3 dat   SCONJ     0.    1.

$`2`
# A tibble: 4 x 6
  doc_id token_id token pos   ispron group
  <fct>     <int> <fct> <fct>  <dbl> <dbl>
1 d1            4 jij   PRON      1.    2.
2 d1            5 dat   SCONJ     0.    2.
3 d1            6 wil   AUX       0.    2.
4 d1            7 en    CCONJ     0.    2.

$`3`
# A tibble: 5 x 6
  doc_id token_id token   pos   ispron group
  <fct>     <int> <fct>   <fct>  <dbl> <dbl>
1 d1            8 ik      PRON      1.    3.
2 d1            9 heb     AUX       0.    3.
3 d1           10 het     DET       0.    3.
4 d1           11 al      ADV       0.    3.
5 d1           12 gekocht VERB      0.    3.