通过改变第一列的数值来分割data.frame。

问题描述 投票:0回答:1

类似于 按价值分割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)

我想用a*来分割 它应该是这样的。

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后面?

r dataframe split
1个回答
2
投票

您可以使用 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
投票

我们也可以这样做

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'))
© www.soinside.com 2019 - 2024. All rights reserved.