如何用pivot_longer函数转换两组变量

5cg8jx4n  于 2023-05-04  发布在  其他
关注(0)|答案(2)|浏览(184)

我有一个数据集,患者在3个不同的日期都有3个测试分数。此时分数和日期都是独立的变量。为了可视化数据,我需要转换它(见下文)。
数据集现在的样子:

Patient     Score_1.  Score_2.  score_3.  date_score1.  date_score2.  date_score3. 
1.          15        10        11        0              4              28
2.          12        9         11        0              7              31
3.          13        7         9         0              5              25

我需要将数据集转换为:

Patient    Date.     Score. 
1.         0         15
1.         4         10
1.         28        11
2.         0         12
2.         7         9
2.         31        11
3.         0         13        
3.         5         7
3.         25        9

Example_data:

structure(list(patient = c(1, 2, 3), Score_1 = c(15, 12, 13), 
    Score_2 = c(10, 9, 7), Score_3 = c(11, 11, 9), Date_score1 = c(0, 
    0, 0), Date_score2 = c(4, 7, 5), Date_score3 = c(28, 31, 
    25)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-3L))

我已经尝试使用pivot_longer转换数据,最接近我想要的是下面的代码。

plotdata <- pivot_longer(
  example_data 
  , cols = -c(Patient, Score_1, Score_2, Score_3)
  , names_to = c( NA, "date_score")
  , names_sep = "_"
  , values_to = "Date"
)

”””开始是好的,我会说。现在我需要将相应的分数添加到date_score中,但我似乎不知道如何操作。我尝试了(但失败了)下面的代码。

plotdata <- pivot_longer(
  plotdata
  , cols = -c(patient, date_score, Date)
  , names_to = c( NA, "Score_")
  , names_sep = "_"
  , values_to = "Score"
)

如果任何人有一个想法,我可以做的第二步转换数据,请让我知道!

bvhaajcl

bvhaajcl1#

使用pivot_longer,我们可以使用names_pattern捕获_之前的字符,并将names_to指定为.value

library(tidyr)
pivot_longer(df1, cols = contains("_"),
    names_to = ".value", names_pattern = "^([^_]+)_.*")
  • 输出
# A tibble: 9 × 3
  patient Score  Date
    <dbl> <dbl> <dbl>
1       1    15     0
2       1    10     4
3       1    11    28
4       2    12     0
5       2     9     7
6       2    11    31
7       3    13     0
8       3     7     5
9       3     9    25
tzcvj98z

tzcvj98z2#

我尽了最大的努力只用pivot_longer()来处理这个问题,但我也失败了。
这里有一个使用data.table的替代解决方案。

library(data.table)

setDT(data) |> 
  melt(measure.vars=patterns(
    date="Date_",
    score="Score")) |> 
  as_tibble() |> 
  select(patient,date,score) |> 
  arrange(patient)

输出

# A tibble: 9 × 3
  patient  date score
    <dbl> <dbl> <dbl>
1       1     0    15
2       1     4    10
3       1    28    11
4       2     0    12
5       2     7     9
6       2    31    11
7       3     0    13
8       3     5     7
9       3    25     9

相关问题