重塑 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
有人问过类似的问题,但还没有到这个程度。我有一个数据框,其中包含如下信息
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