R 重命名匹配不同命名模式的变量以一致方式表示时间的最佳方法?
我有一个广泛的数据集,其中包括参与者的心理测量 跨越不同的时间点 心理测量中的时变标签的形式如下:R 重命名匹配不同命名模式的变量以一致方式表示时间的最佳方法?,r,regex,stringr,stringi,R,Regex,Stringr,Stringi,我有一个广泛的数据集,其中包括参与者的心理测量 跨越不同的时间点 心理测量中的时变标签的形式如下: 问题时间项目。 一个例子是dass1\u 1,其中dass=问卷,1=时间 问卷调查;以及相关问卷的1=项目# 这在问卷调查中基本一致,但有一个心理测量 不遵循此术语的变量:siss1。虽然这 命名法与表示日期和会话的其他变量一致 数据收集数量,即date1和session1。 可以看出,这些变量的标签位于变量的末尾。 但是,有许多变量的名称中包含一个不应更改的数字,特别是cff1,cff2,等等
问题时间项目
。
一个例子是dass1\u 1
,其中dass
=问卷
,1
=时间
问卷调查;以及相关问卷的1
=项目#
这在问卷调查中基本一致,但有一个心理测量
不遵循此术语的变量:siss1
。虽然这
命名法与表示日期和会话的其他变量一致
数据收集数量,即date1
和session1
。
可以看出,这些变量的标签位于变量的末尾。
但是,有许多变量的名称中包含一个不应更改的数字,特别是cff1
,cff2
,等等,这些变量表示此度量中的项目编号,而不是时间(但是,在datefinal
收集期间[见下文])只询问一次
在大多数情况下(1-14),变量名中的时间用数字表示,但单词除外
上次会话的“最终”(例如,datefinal
,sessionfinal
,dassfinal\u 1
,sissffinal
)。
此外,在最后一次会议datefinal
数据收集期结束后的6个月和12个月有一个数据收集期。
用6fup
或12fup
表示,例如date\u 6fup
和dass6fup\u 2
我想更改表示时间变量的字符串以使其一致
并将其放在每个变量名的开头。此外,我想在问卷名称和相关项目编号之间加一个下划线。
例如:
->date1
T1.日期
->session1
T1.session
->siss2
T2.siss
->dass1\u 1
T1.dass1
->datefinal
T15.日期
->dass_6fup_2
T16.dass_2
->date\u 12fup
T17.日期
name(旧版)感谢您的reprex和对您问题的详尽解释。如果我理解正确的话,下面的例行公事应该会告诉你你在追求什么,或者,如果失败了,希望能让你非常接近
我已经使用了两轮stringr::str\u replace\u all
。在第一轮中,我们将所有final
、6fup
和12fup
后缀替换为其指定的数字等价物(即15、16、17)。在第二轮中,我们以剩下的两个主要正则表达式模式为目标,确保排除以cff
前缀开头的任何匹配
# create new_names by applying two rounds of str_replace_all to the old names
new_names <- names(df) %>%
stringr::str_replace_all(c(
'final' = '15',
'_6fup|6fup' = '16',
'_12fup|12fup' = '17'
)) %>%
stringr::str_replace_all(
c(
'^(?!cff\\d)(^[A-z]+)(\\d{1,2})$' = 'T\\2.\\1',
'^(?!cff\\d)(^[A-z]+)(\\d{1,2})_(\\d)' = 'T\\2.\\1_\\3'
)
)
# compare old names to new names
new_names %>% purrr::set_names(names(df))
#> uci dob sex sp_episode staff
#> "uci" "dob" "sex" "sp_episode" "staff"
#> YP_consent date1 session1 dass1_1 dass1_2
#> "YP_consent" "T1.date" "T1.session" "T1.dass_1" "T1.dass_2"
#> dass1_3 siss1 diag1 diag2 diag3
#> "T1.dass_3" "T1.siss" "T1.diag" "T2.diag" "T3.diag"
#> pastpsyc pastmed date2 session2 dass2_1
#> "pastpsyc" "pastmed" "T2.date" "T2.session" "T2.dass_1"
#> dass2_2 dass2_3 siss2 datefinal sessionfinal
#> "T2.dass_2" "T2.dass_3" "T2.siss" "T15.date" "T15.session"
#> dassfinal_1 dassfinal_2 dassfinal_3 dassfinal_4 sissfinal
#> "T15.dass_1" "T15.dass_2" "T15.dass_3" "T15.dass_4" "T15.siss"
#> cff1 cff2 cff3 date_6fup dass6fup_2
#> "cff1" "cff2" "cff3" "T16.date" "T16.dass_2"
#> dass6fup_3 dass6fup_4 siss6fup date_12fup
#> "T16.dass_3" "T16.dass_4" "T16.siss" "T17.date"
#对旧名称应用两轮str\u replace\u all创建新名称
新名称%
stringr::str_替换_全部(c)(
“最终”为“15”,
"6fup | 6fup"等于"16",,
“|12fup | 12fup”=“17”
)) %>%
stringr::str_替换_全部(
c(
“^(?!cff\\d)(^[A-z]+)(\\d{1,2})$”='T\\2\\1',
“^(?!cff\\d)(^[A-z]+)(\\d{1,2})\\\d='T\\2\\1\\3”
)
)
#将旧名称与新名称进行比较
新建\u名称%>%purrr::设置\u名称(名称(df))
#>uci dob性sp_事件员工
#>“uci”“dob”“sex”“sp_插曲”“员工”
#>YP_同意日期1会期1 dass1_1 dass1_2
#>“YP_同意”“T1.date”“T1.session”“T1.dass_1”“T1.dass_2”
#>dass1_3 siss1 diag1 diag2 diag3
#>“T1.dass_3”“T1.siss”“T1.diag”“T2.diag”“T3.diag”
#>pastpsyc pastmed日期2会议2数据集1
#>“pastpsyc”“pastmed”“T2.日期”“T2.会话”“T2.数据1”
#>dass2_2 dass2_3 siss2日期最终会议结束
#>“T2.dass_2”“T2.dass_3”“T2.siss”“T15.date”“T15.session”
#>dassfinal\u 1 dassfinal\u 2 dassfinal\u 3 dassfinal\u 4 sissfinal
#>“T15.dass_1”“T15.dass_2”“T15.dass_3”“T15.dass_4”“T15.siss”
#>cff1 cff2 cff3日期
#>“cff1”“cff2”“cff3”“T16.日期”“T16.数据2”
#>dass6fup_3 dass6fup_4 siss6fup日期
#>“T16.dass_3”“T16.dass_4”“T16.siss”“T17.日期”
感谢您的reprex和对问题的详细解释。如果我理解正确的话,下面的例行公事应该会告诉你你在追求什么,或者,如果失败了,希望能让你非常接近
我已经使用了两轮stringr::str\u replace\u all
。在第一轮中,我们将所有final
、6fup
和12fup
后缀替换为其指定的数字等价物(即15、16、17)。在第二轮中,我们以剩下的两个主要正则表达式模式为目标,确保排除以cff
前缀开头的任何匹配
# create new_names by applying two rounds of str_replace_all to the old names
new_names <- names(df) %>%
stringr::str_replace_all(c(
'final' = '15',
'_6fup|6fup' = '16',
'_12fup|12fup' = '17'
)) %>%
stringr::str_replace_all(
c(
'^(?!cff\\d)(^[A-z]+)(\\d{1,2})$' = 'T\\2.\\1',
'^(?!cff\\d)(^[A-z]+)(\\d{1,2})_(\\d)' = 'T\\2.\\1_\\3'
)
)
# compare old names to new names
new_names %>% purrr::set_names(names(df))
#> uci dob sex sp_episode staff
#> "uci" "dob" "sex" "sp_episode" "staff"
#> YP_consent date1 session1 dass1_1 dass1_2
#> "YP_consent" "T1.date" "T1.session" "T1.dass_1" "T1.dass_2"
#> dass1_3 siss1 diag1 diag2 diag3
#> "T1.dass_3" "T1.siss" "T1.diag" "T2.diag" "T3.diag"
#> pastpsyc pastmed date2 session2 dass2_1
#> "pastpsyc" "pastmed" "T2.date" "T2.session" "T2.dass_1"
#> dass2_2 dass2_3 siss2 datefinal sessionfinal
#> "T2.dass_2" "T2.dass_3" "T2.siss" "T15.date" "T15.session"
#> dassfinal_1 dassfinal_2 dassfinal_3 dassfinal_4 sissfinal
#> "T15.dass_1" "T15.dass_2" "T15.dass_3" "T15.dass_4" "T15.siss"
#> cff1 cff2 cff3 date_6fup dass6fup_2
#> "cff1" "cff2" "cff3" "T16.date" "T16.dass_2"
#> dass6fup_3 dass6fup_4 siss6fup date_12fup
#> "T16.dass_3" "T16.dass_4" "T16.siss" "T17.date"
#对旧名称应用两轮str\u replace\u all创建新名称
新名称%
stringr::str_替换_全部(c)(
“最终”为“15”,
"6fup | 6fup"等于"16",,
“|12fup | 12fup”=“17”
)) %>%
stringr::str_替换_全部(
c(
“^(?!cff\\d)(^[A-z]+)(\\d{1,2})$”='T\\2\\1',
“^(?!cff\\d)(^[A-z]+)(\\d{1,2})\\\d='T\\2\\1\\3”
)
)
#将旧名称与新名称进行比较
新建\u名称%>%purrr::设置\u名称(名称(df))
#>uci dob性sp_集