在r中修改名称时,如何有条件地将df从长到宽进行争论?

在r中修改名称时,如何有条件地将df从长到宽进行争论?,r,dplyr,R,Dplyr,我有一个类似于下面的纵向df,在每个就诊编号(就诊)处,每个参与者(id)都有一行。每次就诊时记录相同的3个变量。我想让每个参与者都成为他们自己的一行, 但将值转换为宽格式。。。以及使新变量名保留原始变量名并将访问名附加到末尾。 我将不得不重复多次,因此我希望避免在事实发生后手动命名它们。想法 我尝试了dcast(),但似乎没有得到我想要的结果。我认为,pivot\u wider()可能在这里有作用,但无法理解 # CURRENT: # A tibble: 12 x 5 id vi

我有一个类似于下面的纵向df,在每个就诊编号(
就诊
)处,每个参与者(
id
)都有一行。每次就诊时记录相同的3个变量。我想让每个参与者都成为他们自己的一行, 但将值转换为宽格式。。。以及使新变量名保留原始变量名并将访问名附加到末尾。 我将不得不重复多次,因此我希望避免在事实发生后手动命名它们。想法

我尝试了
dcast()
,但似乎没有得到我想要的结果。我认为,
pivot\u wider()
可能在这里有作用,但无法理解

# CURRENT:

# A tibble: 12 x 5
      id visit  var1  var2  var3
   <dbl> <txt> <dbl> <dbl> <dbl>
 1     1     v1     1     1     1
 2     1     v2     1     2     1
 3     1     v3     2     2     1
 4     2     v1     1     1     1
 5     2     v2     1     2     1
 6     2     v3     2     2     1
 7     2     v4     2     2     2
 8     3     v1     1     1     1
 9     3     v2     1     2     1
10     3     v3     2     3     1
11     3     v4     2     3     2
12     3     v5     3     3     3




# DESIRED

# A tibble: 3 x 16
     id var1_v1 var1_v2 var1_v3 var1_v4 var1_v5 var2_v1 var2_v2 var2_v3 var2_v4 var2_v5 var3_v1 var3_v2 var3_v3 var3_v4 var3_v5
  <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>   <dbl>
1     1       1       1       3      NA      NA       1       2       2      NA      NA       1       1       1      NA      NA
2     2       1       1       2       2      NA       1       2       2       2      NA       1       1       2       1      NA
3     3       1       1       2       2       3       1       2       3       3       3       1       1       1       2       3
#当前:
#一个tibble:12x5
id访问var1 var2 var3
11v11
2 1 v2 1 2 1
3 1 v3 2 2 1
4.2 v11
5 2 v2 1 2 1
6 2 v3 2 1
7 2 v4 2 2
8 3 v11
9 3 v2 1 2 1
10 3 v3 2 3 1
11 3 v4 2 3 2
12 3 v5 3 3 3
#渴望的
#一个tibble:3x16
id var1\u v1\u v2 var1\u v3 var1\u v4 var1\u v5 var2\u v3 var2\u v4 var2\u v5 var3\u v1\u v2 var3\u v3\u v4 var3\u v5
1 1 1 3钠钠1 2钠钠1 1钠钠
2 2 1 2 NA 1 2 2 NA 1 2 NA 1 1 1 2 NA
3     3       1       1       2       2       3       1       2       3       3       3       1       1       1       2       3

使用
枢轴\u更宽的部分

tidyr::pivot_wider(df, names_from = visit, values_from = starts_with('var'))

#     id var1_v1 var1_v2 var1_v3 var1_v4 var1_v5 var2_v1 var2_v2 var2_v3 var2_v4
#  <int>   <int>   <int>   <int>   <int>   <int>   <int>   <int>   <int>   <int>
#1     1       1       1       2      NA      NA       1       2       2      NA
#2     2       1       1       2       2      NA       1       2       2       2
#3     3       1       1       2       2       3       1       2       3       3
# … with 6 more variables: var2_v5 <int>, var3_v1 <int>, var3_v2 <int>,
#   var3_v3 <int>, var3_v4 <int>, var3_v5 <int>

使用
pivot\u更宽的

tidyr::pivot_wider(df, names_from = visit, values_from = starts_with('var'))

#     id var1_v1 var1_v2 var1_v3 var1_v4 var1_v5 var2_v1 var2_v2 var2_v3 var2_v4
#  <int>   <int>   <int>   <int>   <int>   <int>   <int>   <int>   <int>   <int>
#1     1       1       1       2      NA      NA       1       2       2      NA
#2     2       1       1       2       2      NA       1       2       2       2
#3     3       1       1       2       2       3       1       2       3       3
# … with 6 more variables: var2_v5 <int>, var3_v1 <int>, var3_v2 <int>,
#   var3_v3 <int>, var3_v4 <int>, var3_v5 <int>

在base R中,您可以使用:

reshape(df, timevar = "visit", dir="wide", sep="_")

在base R中,您可以使用:

reshape(df, timevar = "visit", dir="wide", sep="_")