0

次のような data.frame があります。

v1 <- c(1:10)
v2 <- c(FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE)
dfb <- data.frame(v1, v2)

> dfb
   v1    v2
1   1 FALSE
2   2 FALSE
3   3  TRUE
4   4 FALSE
5   5 FALSE
6   6 FALSE
7   7  TRUE
8   8 FALSE
9   9 FALSE
10 10 FALSE

私はそれらの操作が必要です:

  1. V2if isに従って、data.frameを間隔に分割しますTRUE
  2. V2最後の間隔要素にTRUEなる行
  3. 最後の要素がそうでないTRUE場合は、そうであるかのように扱われます (これはTRUE、最後のベクトル位置に追加することで簡単に実現できます)
  4. V1作成された間隔の最初と最後の要素として出力

この操作の後、結果は次のようになります。

  > df_final
   Vx Vy
    1 3
    4 7
    8 10

ベクトルを試してみcumsumましたが、値は最後ではなく最初の間隔要素として扱われますv2TRUE

> split(v2, cumsum(v2==TRUE))
$`0`
[1] FALSE FALSE

$`1`
[1]  TRUE FALSE FALSE FALSE

$`2`
[1]  TRUE FALSE FALSE FALSE
4

3 に答える 3

1

また、Eldio に大きく影響された回答も投稿します。これは、V1数値以外の値であり、splitおよびcumsum関数の使用を避ける場合にも役立ちます。

入力:

v1 <- letters[1:10]
v2 <- c(FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, FALSE, FALSE)
dfb <- data.frame(v1, v2)

> dfb
   v1    v2
1   a FALSE
2   b FALSE
3   c  TRUE
4   d FALSE
5   e FALSE
6   f FALSE
7   g  TRUE
8   h FALSE
9   i FALSE
10  j FALSE

解決:

# data wrangling
library(data.table)
dfb["v3"] <- c(TRUE,dfb$v2[-length(dfb$v2)])
dfb["v4"] <- dfb$v2
dfb$v4[length(dfb$v4)] <- T
Vx <- which(dfb$v3)
Vy <- which(dfb$v4)
Vx <- dfb[Vx, ]$v1
Vy <- dfb[Vy, ]$v1

# for debugging purposes
dfb
   v1    v2    v3    v4
1   a FALSE  TRUE FALSE
2   b FALSE FALSE FALSE
3   c  TRUE FALSE  TRUE
4   d FALSE  TRUE FALSE
5   e FALSE FALSE FALSE
6   f FALSE FALSE FALSE
7   g  TRUE FALSE  TRUE
8   h FALSE  TRUE FALSE
9   i FALSE FALSE FALSE
10  j FALSE FALSE  TRUE

# final results
data.frame(Vx, Vy)
  Vx Vy
1  a  c
2  d  g
3  h  j
于 2017-10-05T11:20:31.383 に答える