У меня есть данные, отформатированные таким образом, когда я извлекаю их для веб-базы данных.
Я хочу отформатировать его, как показано ниже. Я знаю, что мне нужно сначала объединить столбцы Remark_code и Result, но я не уверен, как разбить столбец Parameter_code на отдельные столбцы с заполнением Result в «теле» таблицы.
Мне не обязательно нужен весь код о том, как это сделать, а только указание на то, какие функции использовать. Я боролся с этим, так как я даже не уверен, какие ключевые слова искать или как этот тип преобразования (?) Это будет называться. Любая помощь будет оценена по достоинству.
Мы можем использовать pivot_wider
после unite
обработки столбцов «REMARK_CODE» и «RESULT».
library(dplyr)
library(tidyr)
df1 %>%
unite(RESULT, REMARK_CODE, RESULT, sep = "", na.rm = TRUE) %>%
pivot_wider(names_from = PARAMETER_CODE, values_from = RESULT)
-выход
# A tibble: 2 x 7
# SITE DATE TIME `10` `95` `300` `34475`
# <chr> <chr> <chr> <chr> <chr> <chr> <chr>
# 1 001 1/1/2020 15:10 16.6 521 5.6 <1
# 2 001 3/30/2020 9:45 18 546 3.7 2.3
df1 <- structure(list(SITE = c("001", "001", "001", "001", "001", "001",
"001", "001"), DATE = c("1/1/2020", "1/1/2020", "1/1/2020", "1/1/2020",
"3/30/2020", "3/30/2020", "3/30/2020", "3/30/2020"), TIME = c("15:10",
"15:10", "15:10", "15:10", "9:45", "9:45", "9:45", "9:45"), PARAMETER_CODE = c(10L,
95L, 300L, 34475L, 10L, 95L, 300L, 34475L), REMARK_CODE = c(NA,
NA, NA, "<", NA, NA, NA, NA), RESULT = c(16.6, 521, 5.6, 1, 18,
546, 3.7, 2.3)), row.names = c(NA, -8L), class = "data.frame")
Другой подход может быть:
library(dplyr)
library(tidyr)
#Code
new <- df %>% mutate(RESULT=ifelse(is.na(REMARK_CODE),paste0('',RESULT),
paste0(REMARK_CODE,RESULT))) %>%
select(-REMARK_CODE) %>%
pivot_wider(names_from = PARAMETER_CODE,values_from=RESULT)
Выход:
# A tibble: 2 x 7
SITE DATE TIME `10` `95` `300` `34475`
<chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 001 1/1/2020 15:10 16.6 521 5.6 <1
2 001 3/30/2020 9:45 18 546 3.7 2.3
Некоторые используемые данные:
#Data
df <- structure(list(SITE = c("001", "001", "001", "001", "001", "001",
"001", "001"), DATE = c("1/1/2020", "1/1/2020", "1/1/2020", "1/1/2020",
"3/30/2020", "3/30/2020", "3/30/2020", "3/30/2020"), TIME = c("15:10",
"15:10", "15:10", "15:10", "9:45", "9:45", "9:45", "9:45"), PARAMETER_CODE = c(10L,
95L, 300L, 34475L, 10L, 95L, 300L, 34475L), REMARK_CODE = c(NA,
NA, NA, "<", NA, NA, NA, NA), RESULT = c(16.6, 521, 5.6, 1, 18,
546, 3.7, 2.3)), row.names = c(NA, -8L), class = "data.frame")
Вы хотите «изменить форму с длинной на широкую». База R имеет функцию
reshape
. Еще один популярный вариант —tidyr::pivot_wider
. Обратите внимание, что «широкий» формат популярен в таблицах Excel, в то время как большинство пользователей R предпочитают свои наборы данных в «длинном» формате (как у вас уже есть). Статья Хэдли о Tidy Data объясняет, почему.