R 根据单词或数字将一列分隔为多列

R 根据单词或数字将一列分隔为多列,r,dplyr,R,Dplyr,我想将当前数据框中的列按所需数据框中的方式分成两列。当前的一个是这样的,因为它是刮下来的,无法更改。我曾想过使用dplyr甚至regex来区分单词和时间,但不知道如何区分 我的真实数据框有真实的影院名称(一两个以大写字母开头的单词) 当前数据帧列的类型(如果为“整数”) current使用dplyr和tidyr::fill,我们可以首先替换次,这些次不以“电影院”开始。然后在时间中用“cinema”填充缺少的值并删除行 library(dplyr) current %>% mutat

我想将当前数据框中的列按所需数据框中的方式分成两列。当前的一个是这样的,因为它是刮下来的,无法更改。我曾想过使用dplyr甚至regex来区分单词和时间,但不知道如何区分

我的真实数据框有真实的影院名称(一两个以大写字母开头的单词)

当前数据帧列的类型(如果为“整数”)


current使用
dplyr
tidyr::fill
,我们可以首先
替换
,这些次不以
“电影院”
开始。然后在
时间
中用
“cinema”
填充缺少的值并删除行

library(dplyr)

current %>%
  mutate(cinema = replace(times, !grepl("^cinema", times), NA)) %>%
  tidyr::fill(cinema) %>%
  filter(!grepl("^cinema", times))

#  times  cinema
#1 10:30 cinema1
#2 12:30 cinema1
#3  9:30 cinema2
#4 16:30 cinema2
#5 17:30 cinema3
数据

current <- data.frame(times = c("cinema1", "10:30", "12:30", "cinema2", "9:30", 
                        "16:30", "cinema3", "17:30"), stringsAsFactors = FALSE)

current使用
dplyr的另一种方法是:

current %>%
 group_by(grp = cumsum(grepl("cinema", times, fixed = TRUE))) %>%
 mutate(cinema = first(times)) %>%
 filter(row_number() != 1) %>%
 ungroup() %>%
 select(-grp)

  times cinema 
  <chr> <chr>  
1 10:30 cinema1
2 12:30 cinema1
3 9:30  cinema2
4 16,30 cinema2
5 17:30 cinema3
当前%>%
分组依据(grp=cumsum(grepl(“电影院”,时间,固定=TRUE)))%>%
变异(电影=第一次(次数))%>%
过滤器(行号()!=1)%>%
解组()%>%
选择(-grp)
时代电影
110:30电影院1
2:12:30.1
3:9:30.2
4 16,30 2
5:17:30.3

我们可以使用
堆栈
grepl
base R

i1 <- grepl('cinema', current$times)
stack(setNames(split(current$times[!i1], cumsum(i1)[!i1]), current$times[i1]))
#  values     ind
#1  10:30 cinema1
#2  12:30 cinema1
#3   9:30 cinema2
#4  16,30 cinema2
#5  17:30 cinema3

i1如果我的真实数据库中有真实的电影院名称(一两个以大写字母开头的单词),该怎么办。如何使用正则表达式过滤这些内容?@InesGuardans在这种情况下,使用将
mutate
更改为
mutate(cinema=replace(times,!grepl(^[:upper:]],times),NA)
i1 <- grepl('cinema', current$times)
stack(setNames(split(current$times[!i1], cumsum(i1)[!i1]), current$times[i1]))
#  values     ind
#1  10:30 cinema1
#2  12:30 cinema1
#3   9:30 cinema2
#4  16,30 cinema2
#5  17:30 cinema3