Как я могу использовать данные в df.x и использовать функции для выбора и добавления в df.y

#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 .