#r
Вопрос:
Я новичок в R и пытаюсь написать фрагмент кода, который позволит мне выбрать некоторые данные в df.x и поместить их в df.y:
Category 2019 2020 2021 2022 2023
Apple 3 4 5 6 7
Pear 3 4 5 6 7
Banana 3 4 5 6 7
Oranges 3 4 5 6 7
Я хочу выбрать значение для апельсинов в 2019 году и ввести df.y и разницу в годах для Apple в новый df.y, как это:
Resource 2019 2020 2021 2022 2023
Orange 3 4 5 6 7
Apple 1 1 1 1
Любая помощь будет признательна!!!
Спасибо
Комментарии:
1. можете ли вы уточнить логику и желаемый результат, не уверены, соответствует ли ваше письменное описание тому, что вы хотите в
df.y
2. Привет, EJJ, в основном я хочу использовать данные df.x, чтобы либо выбрать значение и ввести df.y, либо я хочу выполнить некоторые вычисления с использованием df.x, например, 2020. Стоимость яблока минус стоимость яблока 2019 года и поместите ее в df.y….
Ответ №1:
Это tidyverse
подход, предполагающий широкое и длительное преобразование, поскольку легче рассчитать разницу в годах.
library(tidyverse)
df.x <- tibble(
Category = c("Apple", "Pear", "Banana", "Orange"),
"2019" = 3,
"2020" = 4,
"2021" = 5,
"2022" = 6,
"2023" = 7
)
df.y <- df %>%
filter(Category %in% c("Apple", "Orange")) %>%
pivot_longer(-Category) %>%
mutate(value = ifelse(Category == "Apple", value - lag(value, 1), value)) %>%
pivot_wider()
# A tibble: 2 x 6
# Category `2019` `2020` `2021` `2022` `2023`
# <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 Apple NA 1 1 1 1
#2 Orange 3 4 5 6 7
Ответ №2:
Сначала вам необходимо предоставить свои данные с помощью dput(df.x)
:
df.x <- structure(list(Category = c("Apple", "Pear", "Banana", "Oranges"
), X2019 = c(3L, 3L, 3L, 3L), X2020 = c(4L, 4L, 4L, 4L), X2021 = c(5L,
5L, 5L, 5L), X2022 = c(6L, 6L, 6L, 6L), X2023 = c(7L, 7L, 7L,
7L)), class = "data.frame", row.names = c(NA, -4L))
Обратите внимание, что имена ваших столбцов изменились, поскольку R не позволяет именам столбцов/переменных начинаться с числа. Процесс извлечения информации из фрейма данных подробно описан на странице руководства: ?Extract
. Он немного плотный, поэтому, возможно, будет проще начать с некоторых вводных руководств по R.
Чтобы извлечь строку для Oranges
:
row1 <- df.x[df.x$Category=="Oranges", ]
row1
# Category X2019 X2020 X2021 X2022 X2023
# 4 Oranges 3 4 5 6 7
Номер строки указывает на то, что это 4-я строка в df.x. Теперь вторая строка немного более задействована. Сначала извлеките строку:
row2 <- df.x[df.x$Category=="Apple", ]
row2
# Category X2019 X2020 X2021 X2022 X2023
# 1 Apple NA 1 1 1 1
Теперь вычислите различия по строке, преобразовав строку фрейма данных в простой вектор , unlist
поскольку diff
он разборчив в том, с какой структурой данных он будет работать, и вставьте пропущенное значение, NA
, в течение первого года:
row2[ , -1] <- c(X2019=NA, diff(unlist(row2[, -1])))
df.y <- rbind(row1, row2)
df.y
# Category X2019 X2020 X2021 X2022 X2023
# 4 Oranges 3 4 5 6 7
# 1 Apple NA 1 1 1 1
rownames(df.y) <- NULL
Последняя строка просто сбрасывает имена строк, которые были перенесены из df.x
.