разделить data.frame на переменное значение в первом столбце - PullRequest
1 голос
/ 09 мая 2020

Аналогично Разделить data.frame по значению Я хочу разделить df по значению. В моем случае значение не всегда точно такое же. Я пробовал это, но безуспешно:

df <- data.frame(var1 = c("ab", 1, 2, 3, "ac", 1, 2, 3, 4, 5, 6, "ad", 1, 2), var2 = 1:14)

Я хочу разделить на *. Должно получиться так:

ab 1
1 2
2 3
3 4

ac 5
1 6
2 7
3 8
4 9
5 10
6 11

ad 12
1 13
2 14

Я пробовал это, чтобы получить

df[,1] == "a*"
#it shows all over 0

#I would do sth. like that
#split(df, cumsum(df[,1] == "a*"))

Я думаю, что * неверно. Но как сказать R, что разные значения идут после a?

Ответы [ 2 ]

2 голосов
/ 09 мая 2020

Вы можете использовать grepl для сопоставления с шаблоном и cumsum над ним для создания групп.

split(df, cumsum(grepl('a.*', df$var1)))


#$`1`
#  var1 var2
#1   ab    1
#2    1    2
#3    2    3
#4    3    4

#$`2`
#   var1 var2
#5    ac    5
#6     1    6
#7     2    7
#8     3    8
#9     4    9
#10    5   10
#11    6   11

#$`3`
#   var1 var2
#12   ad   12
#13    1   13
#14    2   14

Эквивалентный ответ в tidyverse:

library(dplyr)
library(stringr)

df %>%  group_split(cumsum(str_detect(var1, 'a.*')), keep = FALSE)
1 голос
/ 09 мая 2020

Мы также можем сделать это с помощью

split(df, cumsum(startsWith(as.character(df$var1), "a")))
#$`1`
#  var1 var2
#1   ab    1
#2    1    2
#3    2    3
#4    3    4

#$`2`
#   var1 var2
#5    ac    5
#6     1    6
#7     2    7
#8     3    8
#9     4    9
#10    5   10
#11    6   11

#$`3`
#   var1 var2
#12   ad   12
#13    1   13
#14    2   14

Или с substr

split(df, cumsum(substr(df$var1, 1, 1) == 'a'))
...