假设我从这样的数据集开始(它来自盖洛普)。我想将年份和日期从数据集中提取到新列中。所以我尝试拆分日期字符串......
index date R D
1 2018 Jan 2-7 35 50
2 2017 Dec 4-11 41 45
3 2017 Nov 2-8 39 46
4 2017 Oct 5-11 39 46
5 2017 Sep 6-10 45 47
6 2017 Aug 2-6 43 46
..使用mutate
dataset <- data %>%
mutate(Y = strsplit(date, split = " ")[[1]][1]) %>%
mutate(M = strsplit(date, split = " ")[[1]][2])
但是strsplit,而不是在日期行上操作,似乎在所有列值的列表上运行。
所以我最终得到[[1]]子集访问器只是抓取第一行值,而不是与每行相关的列表条目。
index date R D Y M
1 2018 Jan 2-7 35 3 2018 Jan
2 2017 Dec 4-11 41 3 2018 Jan
3 2017 Nov 2-8 39 3 2018 Jan
4 2017 Oct 5-11 39 3 2018 Jan
5 2017 Sep 6-10 45 3 2018 Jan
6 2017 Aug 2-6 43 3 2018 Jan
如何拆分字符串以便从列表中推断每行的值?使用索引作为子集访问器不起作用。
答案 0 :(得分:2)
我建议使用stringr
包,它是tidyverse的一部分,因此可以与dplyr无缝协作。
data %>% mutate(Y = str_extract(date, "^\\d{4}"),
M = str_extract(date, "[A-Za-z]{3}"))
# index date R D Y M
# 1 1 2018 Jan 2-7 35 50 2018 Jan
# 2 2 2017 Dec 4-11 41 45 2017 Dec
# 3 3 2017 Nov 2-8 39 46 2017 Nov
# 4 4 2017 Oct 5-11 39 46 2017 Oct
# 5 5 2017 Sep 6-10 45 47 2017 Sep
# 6 6 2017 Aug 2-6 43 46 2017 Aug
str_extract
允许您根据模式提取子字符串 - 这里,我们使用两个不同的正则表达式。第一个匹配字符串开头的4个连续数字(\\d{4}
)(^
)。第二个表达式只需要连续3个字母([A-Za-z]
),考虑到日期的结构,这是安全的。
但是,如果您仍希望将strsplit
与mutate
一起使用,则可以添加对rowwise
的调用:
data %>% rowwise() %>% mutate(Y = strsplit(date, split = " ")[[1]][1],
M = strsplit(date, split = " ")[[1]][2])
答案 1 :(得分:2)
我们可以使用tidyr中的library(tidyr)
dat2 <- dat %>%
extract(date, into = c("Y", "M"), regex = "(\\d{4}) ([A-Za-z]{3})", remove = FALSE)
dat2
# index date Y M R D
# 1 1 2018 Jan 2-7 2018 Jan 35 50
# 2 2 2017 Dec 4-11 2017 Dec 41 45
# 3 3 2017 Nov 2-8 2017 Nov 39 46
# 4 4 2017 Oct 5-11 2017 Oct 39 46
# 5 5 2017 Sep 6-10 2017 Sep 45 47
# 6 6 2017 Aug 2-6 2017 Aug 43 46
函数和捕获组。
dat <- read.table(text = "index date R D
1 '2018 Jan 2-7' 35 50
2 '2017 Dec 4-11' 41 45
3 '2017 Nov 2-8' 39 46
4 '2017 Oct 5-11' 39 46
5 '2017 Sep 6-10' 45 47
6 '2017 Aug 2-6' 43 46",
header = TRUE, stringsAsFactors = FALSE)
数据强>
lambda ...: ...