【问题标题】:R use reshape to transfer data from wide to longR使用reshape将数据从宽传输到长
【发布时间】:2021-02-11 17:32:07
【问题描述】:

我的数据包含三个时间点的测量值。有 2 个组(安慰剂组和治疗组),每个组都分配了一个 ID。数据看起来像

Group      ID          Time1         Time2        Time3
1           1          33             44           77
1           2          24             123          54
1           3          32             343          434
1           4          23             23           22
2           5          14             13           24
2           6          67             14           33
2           7          55             34           35
2           6          33             12           11

想要的输出应该是这样的:

Group     ID    Measurement
1         1     33
1         1     44
1         1     77
1         2     24
1         2     123
1         2     54

等等。

如何使用 reshape 函数转换为长格式?谢谢。

【问题讨论】:

  • 不清楚你想要什么。有两行具有相同的 GroupID,这是人们意想不到的,显示的输出没有说明如何处理。

标签: r reshape


【解决方案1】:

这是一个基本的 R reshape 解决方案。

vars <- grep("^Time", names(df1), value = TRUE)
Times <- as.integer(sub("[^[:digit:]]*", "", vars))
df1$row.number <- seq_len(nrow(df1))

df2 <- reshape(df1, 
               varying = list(vars), 
               v.names = "Time",
               idvar = c("row.number", "ID", "Group"), 
               times = Times,
               timevar = "Time",
               direction = "long")
df2$row.number <- NULL
row.names(df2) <- NULL

head(df2)
#  Group ID Time
#1     1  1   33
#2     1  2   24
#3     1  3   32
#4     1  4   23
#5     2  5   14
#6     2  6   67

数据

df1 <- read.table(text = "
Group      ID          Time1         Time2        Time3
1           1          33             44           77
1           2          24             123          54
1           3          32             343          434
1           4          23             23           22
2           5          14             13           24
2           6          67             14           33
2           7          55             34           35
2           6          33             12           11
", header = TRUE)

【讨论】:

    【解决方案2】:

    使用reshape 函数你可以试试这个:

    reshape(df, 
            direction = "long",
            varying = c("Time1", "Time2", "Time3"),
            v.names = "Meassurement",
            idvar = c("Group", "ID"),
            timevar = "Time",
            new.row.names= as.character(1:(nrow(df)*3)))
    
       Group ID Time Meassurement
    1      1  1    1           33
    2      1  2    1           24
    3      1  3    1           32
    4      1  4    1           23
    5      2  5    1           14
    6      2  6    1           67
    7      2  7    1           55
    8      2  8    1           33
    

    这是tidyversepivot_longer 的方式:

    df %>% 
      pivot_longer(cols = contains("Time"),
                   names_to = "Time",
                   values_to = "Measurement")
    
    # A tibble: 24 x 4
       Group    ID Time  Measurement
       <int> <int> <chr>       <int>
     1     1     1 Time1          33
     2     1     1 Time2          44
     3     1     1 Time3          77
     4     1     2 Time1          24
     5     1     2 Time2         123
     6     1     2 Time3          54
     7     1     3 Time1          32
     8     1     3 Time2         343
     9     1     3 Time3         434
    10     1     4 Time1          23
    # ... with 14 more rows
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 2018-04-19
      • 2012-07-03
      • 2021-07-15
      • 1970-01-01
      相关资源
      最近更新 更多