Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 重命名匹配不同命名模式的变量以一致方式表示时间的最佳方法?_R_Regex_Stringr_Stringi - Fatal编程技术网

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_集