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

使用tidyverse/dplyr从其他列子字符串创建列,r,dplyr,R,Dplyr,假设我们在R中有这个数据帧: start = data.frame( Title = c("name_year0","name_year1","name_year2"), value = c(4,5,6) ) 我想对其进行修改,使Title中的年份信息出现在年份列中: Title value year name 4 0 name 5 1 name 6 2 Ti

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

start = data.frame(
  Title = c("name_year0","name_year1","name_year2"),
  value = c(4,5,6)
)
我想对其进行修改,使
Title
中的年份信息出现在年份列中:

       Title value  year
        name     4     0
        name     5     1
        name     6     2
       Title value  year
  name_year0     4 year0
  name_year1     5 year1
  name_year2     6 year2
此代码几乎可以工作:

result1 = test %>% 
  mutate(year = str_match(Title, "year[0-9]+"))
但结果是,将字符串名称保留在“年份”列中:

       Title value  year
        name     4     0
        name     5     1
        name     6     2
       Title value  year
  name_year0     4 year0
  name_year1     5 year1
  name_year2     6 year2
似乎我应该能够使用regex匹配中的组从
年份中提取数字部分,如下所示:

result2 = test %>% 
  mutate(year = str_match(Title, "year([0-9]+)")[1,2])
但出于某种原因,它似乎总是返回相同的年份值:

       Title value year
  name_year0     4    0
  name_year1     5    0
  name_year2     6    0
我遗漏了什么(可能很简单)?为什么
str\u match(“name\u year0”,“year([0-9]+)”)”[2]
对单个字符串有效,但当我将其放入
mutate
中时却无效


谢谢

我想你是打错了。在
str_match(标题,“年份([0-9]+)”)[1,2]
中,
[1,2]
返回行=1,列=2的值。要获取第2列,请使用
[,2]
,或者仅使用
[2]
来指示第2列,就像您在回复评论中提到的那样

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个值,如本例所示

> 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

看起来像:,看起来你有两个选择谢谢。为了清楚起见,更新了问题。我不明白的是为什么
str\u match(“name\u year0”,“year([0-9]+)”)”[2]
有效,但当我将它放入
mutate
时它就不起作用了。啊,我不知道为什么我一直在使用
[1,2]
。谢谢然而,仅仅使用
[2]
对我来说并不适用。它似乎返回所有结果的第二行(即“year1”)。无论如何,谢谢。