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