使用tidyverse/dplyr从其他列子字符串创建列
假设我们在R中有这个数据帧:使用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
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”)。无论如何,谢谢。