重塑 R 数据框,使一列的值现在是它们自己的列并按其他列分组

Reshaping R dataframe so values of one column are now their own column and grouping by other columns

有人问过类似的问题,但还没有到这个程度。我有一个数据框,其中包含如下信息

location    field    sample    date          height    temp   
loc1        fieldA   1_1       202001        1         86     
loc1        fieldA   1_1       202001        10        92     
loc1        fieldA   2_1       202001        1         88
loc1        fieldA   2_1       202001        10        82
loc1        filedA   1_2       202002        1         81
loc1        fieldA   1_2       202002        10        90
loc1        filedA   2_2       202002        1         88
loc1        filedA   2_2       202002        10        82

每个位置都有多个字段,每个字段有两个测量位置,每个位置都有两个高度用于测量。例如,在 location1 fieldA sample 1_1 中指的是第一个位置和第一个样本,并且有两个高度是在某个日期拍摄的。然后是 location1, fieldA sample 1_2 ,它指的是第一个位置,但第二个样本是在第二个日期。这进一步与 locB 和更多的字段名称,但这是基本的想法

理想情况下我需要以下内容

location    field   1_1_temp  1_10_temp  2_1_temp    2_10_temp     date
loc1        fieldA  86        92         88          82            202001
loc1        fieldA  81        90         88          82            202002

对于每个位置和每个字段,我需要数据的时间序列。 location1 fieldA 将有一个时间序列,location1 fieldB 将有一个时间序列,location2 fieldAA 将有一个等等。其中 1_1_temp 将是第一个位置和高度 1,1_10_temp 将是高度 10 处的第一个位置,依此类推。我确定我需要 dplyr 和 tidy 但不确定如何做到这一点。像

df <- group_by(location) %>%
       group_by(field) %>%
      mutate()

非常感谢任何帮助。谢谢!

假设 filedA 是一个错误,请回答下一个代码您的问题?

library(dplyr)
library(tidyr)

df <- read.table(text = 'location    field    sample    date          height    temp   
loc1        fieldA   1_1       202001        1         86     
loc1        fieldA   1_1       202001        10        92     
loc1        fieldA   2_1       202001        1         88
loc1        fieldA   2_1       202001        10        82
loc1        fieldA   1_2       202002        1         81
loc1        fieldA   1_2       202002        10        90
loc1        fieldA   2_2       202002        1         88
loc1        fieldA   2_2       202002        10        82', header = TRUE)

df %>% 
    mutate(sample = sub("(\d)_\d","\1",sample)) %>% 
    pivot_wider(id_cols = c(location, field, date, sample), names_from = c(height), values_from = temp, names_prefix = "sample")
# A tibble: 4 × 6
  location field    date sample sample1 sample10
  <chr>    <chr>   <int> <chr>    <int>    <int>
1 loc1     fieldA 202001 1           86       92
2 loc1     fieldA 202001 2           88       82
3 loc1     fieldA 202002 1           81       90
4 loc1     fieldA 202002 2           88       82

问题更新后更新:

df %>% 
    mutate(sample = sub("(\d)_\d","\1",sample)) %>% 
    pivot_wider(id_cols = c(location, field, date), names_from = c(sample, height), values_from = temp, names_prefix = "sample") %>% 
    mutate(date = lubridate::ym(as.character(date)))
# A tibble: 2 × 7
  location field  date       sample1_1 sample1_10 sample2_1 sample2_10
  <chr>    <chr>  <date>         <int>      <int>     <int>      <int>
1 loc1     fieldA 2020-01-01        86         92        88         82
2 loc1     fieldA 2020-02-01        81         90        88         82