首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在尝试索引时,Dplyr会更改重复的列表值。

在尝试索引时,Dplyr会更改重复的列表值。
EN

Stack Overflow用户
提问于 2018-02-14 01:23:35
回答 2查看 494关注 0票数 0

假设我从这样的数据集开始(它来自盖洛普)。我想将年份和日期从dataset中提取出来,放到一个新的列中。所以我试着分割日期串..。

代码语言:javascript
运行
复制
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

。。使用突变

代码语言:javascript
运行
复制
dataset <- data %>% 
      mutate(Y = strsplit(date, split = " ")[[1]][1]) %>%
      mutate(M = strsplit(date, split = " ")[[1]][2])

但是str拆分(而不是对日期行进行操作)似乎是对所有列值的列表进行操作。

因此,我的结果是[1]子集访问器只获取第一行值,而不是与每一行相关的列表条目。

代码语言:javascript
运行
复制
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

如何将字符串拆分,从而从列表中推断每一行的值?使用索引作为子集访问器不起作用。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-14 02:43:31

我建议使用包stringr,它是tidyverse的一部分,因此与dplyr无缝地工作。

代码语言:javascript
运行
复制
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]),考虑到日期的结构,这是安全的。

但是,如果您仍然希望将strsplitmutate结合使用,则可以添加对rowwise的调用

代码语言:javascript
运行
复制
data %>% rowwise() %>% mutate(Y = strsplit(date, split = " ")[[1]][1],
                              M = strsplit(date, split = " ")[[1]][2])
票数 2
EN

Stack Overflow用户

发布于 2018-02-14 03:59:15

我们可以在捕获组中使用来自extract提尔函数。

代码语言:javascript
运行
复制
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

数据

代码语言:javascript
运行
复制
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)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48778309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档