Saya berjuang dengan tugas ini: Saya memiliki kerangka data ini:

df <- structure(list(col1 = c("A", "A", "A", "B", "A", "A", "C", "A"
)), class = "data.frame", row.names = c(NA, -8L))

  col1
1    A
2    A
3    A
4    B
5    A
6    A
7    C
8    A

Saya ingin mendapatkan hitungan A di urutan pertama saja.

Jawaban yang diharapkan adalah 3!

Pembaruan: diharapkan tidak berfungsi Keluaran:

df %>% 
  summarise(first_sequence_A = sum(col1=="A")) 
# not working because counting all A's

# resluting in:
  first_sequence_A
1                6

expected:
  first_sequence_A
1                3

Saya lebih suka solusi dengan dplyr

Saya telah mencoba cumsum, rle, lag... tapi saya tidak bisa!

2
TarJae 30 September 2021, 22:11

2 jawaban

Jawaban Terbaik

Kita dapat menggunakan rle dari base R

with(rle(df$col1 == "A"), lengths[values][1])
[1] 3

Atau dalam sintaks dplyr

df %>% 
   summarise(first_sequence_A = with(rle(col1 == "A"), lengths[values][1]))
  first_sequence_A
1                3
1
akrun 30 September 2021, 19:33

Tidak yakin seperti apa hasil akhir ideal Anda, tetapi mungkin seperti ini?

Sunting: mungkin cara yang lebih baik dan lebih ringkas untuk melakukan ini, tapi ...

library(dplyr)
library(data.table)

df %>% 
  mutate(x = rleid(col1)) %>% 
  group_by(col1, x) %>% 
  tally() %>% 
  slice(1) %>% 
  filter(col1 == "A") %>% 
  summarize(first_sequence_A = n)

Memberi kita:

# A tibble: 1 x 2
  col1  first_sequence_A
  <chr>            <int>
1 A                    3
1
Matt 30 September 2021, 19:30