使用 Pivot long 的多个变量的长轴

Long pivot for multiple variables using Pivot long

我正在尝试使用 Tidyr 的 Pivot_longer 将宽 table 数据重塑为长数据。但是,无法实现结果 - 尝试搜索但无法找到确切的场景。

示例:

    x<- read.table(header=T, text='
   Dt1 V1_cur V2_cur V1_count V2_count  Other_1 
     A   10    6     50     10      Abc
     A   12    5     70     11      Xyz
     B   20    7     20     8       Axy
     B   22    8     22     9       Ax
   ')

# The result which I am trying to get is, to have one Character column with values Category-> values (V1,V2) and two measure columns Cur, Count.

# Dt1 Other_1 Category Cur Count
# A   Abc     V1       10   50
# A   Xyz     V1       12   70
# A   Abc     V2       6    10
# A   Xyz     V2       5    11
# B   Abc     V1       20   20
# B   Xyz     V1       22   22
# B   Abc     V2       7    8
# B   Xyz     V2       8    9

我也尝试过使用 Reshape/Gather,但是它导致了其他问题。但是,如果有人可以让我知道是否可以使用 tidyr Pivot Longer 方法实现上述结果。谢谢!

使用的代码:

pivot_longer(x,cols=c("V1_cur","V2_cur","V1_count","V2_count"),names_to=c("Category"),values_to=c("Cur","Count"))

我无法理解如何正确地将它们分开。

您可以使用 Base R 中的 reshape

reshape(x, matrix(2:5,2,byrow = T),dir="long",
          idvar = c("Dt1","Other_1"),times =c("v1","v2"),v.name=c("cur","count"))
         Dt1 Other_1 time cur count
A.Abc.v1   A     Abc   v1  10    50
A.Xyz.v1   A     Xyz   v1  12    70
B.Axy.v1   B     Axy   v1  20    20
B.Ax.v1    B      Ax   v1  22    22
A.Abc.v2   A     Abc   v2   6    10
A.Xyz.v2   A     Xyz   v2   5    11
B.Axy.v2   B     Axy   v2   7     8
B.Ax.v2    B      Ax   v2   8     9

据我所知,使用 tidyr 时需要单独的步骤

x %>%
  pivot_longer(c(-Dt1, -Other_1)) %>%
  separate(name, "_", into = c("Category", "measure")) %>%
  spread(measure, value)

如果您更改变量名称可能会更容易:

x <- x %>% 
  rename(cur_V1 = V1_cur, 
         cur_V2 = V2_cur, 
         count_V1 = V1_count,
         count_V2 = V2_count)

然后,您可以像这样使用 pivot_longer

x %>% 
  pivot_longer(-c(Dt1, Other_1),
               names_to = c(".value", "Category"), 
               names_sep = "_")
# A tibble: 8 x 5
  Dt1   Other_1 Category   cur count
  <fct> <fct>   <chr>    <int> <int>
1 A     Abc     V1          10    50
2 A     Abc     V2           6    10
3 A     Xyz     V1          12    70
4 A     Xyz     V2           5    11
5 B     Axy     V1          20    20
6 B     Axy     V2           7     8
7 B     Ax      V1          22    22
8 B     Ax      V2           8     9