假设我从这样的数据集开始(它来自盖洛普)。我想将年份和日期从dataset中提取出来,放到一个新的列中。所以我试着分割日期串..。
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
。。使用突变
dataset <- data %>%
mutate(Y = strsplit(date, split = " ")[[1]][1]) %>%
mutate(M = strsplit(date, split = " ")[[1]][2])
但是str拆分(而不是对日期行进行操作)似乎是对所有列值的列表进行操作。
因此,我的结果是[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
如何将字符串拆分,从而从列表中推断每一行的值?使用索引作为子集访问器不起作用。
发布于 2018-02-14 02:43:31
我建议使用包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
允许您根据模式提取子字符串--在这里,我们使用两个不同的正则表达式。第一个匹配字符串(\\d{4}
)开头的4个连续数字(^
)。第二个表达式只需连续使用3个字母([A-Za-z]
),考虑到日期的结构,这是安全的。
但是,如果您仍然希望将strsplit
与mutate
结合使用,则可以添加对rowwise
的调用
data %>% rowwise() %>% mutate(Y = strsplit(date, split = " ")[[1]][1],
M = strsplit(date, split = " ")[[1]][2])
发布于 2018-02-14 03:59:15
我们可以在捕获组中使用来自extract
的提尔函数。
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)
https://stackoverflow.com/questions/48778309
复制相似问题