首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用tidyverse/dplyr从其他列子字符串创建列

使用tidyverse/dplyr从其他列子字符串创建列
EN

Stack Overflow用户
提问于 2018-10-16 17:18:34
回答 1查看 175关注 0票数 1

假设我们在R中有这个数据框架:

代码语言:javascript
复制
start = data.frame(
  Title = c("name_year0","name_year1","name_year2"),
  value = c(4,5,6)
)

我想对它进行修改,使来自Title的年份信息出现在一个年份专栏中:

代码语言:javascript
复制
       Title value  year
        name     4     0
        name     5     1
        name     6     2

此代码几乎有效:

代码语言:javascript
复制
result1 = test %>% 
  mutate(year = str_match(Title, "year[0-9]+"))

但结果是,它将字符串名称保留在年份列中:

代码语言:javascript
复制
       Title value  year
  name_year0     4 year0
  name_year1     5 year1
  name_year2     6 year2

看来,我应该能够在regex匹配中使用组从year中提取数字部分,如下所示:

代码语言:javascript
复制
result2 = test %>% 
  mutate(year = str_match(Title, "year([0-9]+)")[1,2])

但出于某种原因,这似乎总是返回相同的年份价值:

代码语言:javascript
复制
       Title value year
  name_year0     4    0
  name_year1     5    0
  name_year2     6    0

我错过了什么(可能很简单)?为什么str_match("name_year0","year([0-9]+)")[2]对单个字符串起作用,但当我把它放在mutate中时,它却不起作用

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-16 18:01:35

我猜你打错了。在str_match(Title, "year([0-9]+)")[1,2]中,[1,2]返回row=1,column=2的值。要获得第2列,使用[ , 2]代替,或者使用[2]来表示第2列,就像您在注释响应中提到的那样。

代码语言:javascript
复制
start = data.frame(
  Title = c("name_year0","name_year1","name_year2"),
  value = c(4,5,6)
)

start %>% 
  mutate(year = str_match(Title, "year([0-9]+)")[,2])

编辑:对不起,我犯了一个错误。Str_match在这里返回一个矩阵。矩阵就像向量(按列排列)。[2]是矩阵中的第二个值,而[20]是左上角的第20个值,列第一,如本例所示。

代码语言:javascript
复制
> a=matrix(1:100, ncol=10)

> a
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]    1   11   21   31   41   51   61   71   81    91
 [2,]    2   12   22   32   42   52   62   72   82    92
 [3,]    3   13   23   33   43   53   63   73   83    93
 [4,]    4   14   24   34   44   54   64   74   84    94
 [5,]    5   15   25   35   45   55   65   75   85    95
 [6,]    6   16   26   36   46   56   66   76   86    96
 [7,]    7   17   27   37   47   57   67   77   87    97
 [8,]    8   18   28   38   48   58   68   78   88    98
 [9,]    9   19   29   39   49   59   69   79   89    99
[10,]   10   20   30   40   50   60   70   80   90   100

> a[2]
[1] 2

> a[20]
[1] 20
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52840814

复制
相关文章

相似问题

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