Неоднократно сравнивайте одну и ту же часть набора данных с другими частями набора данных на основе значения индекса в R - PullRequest
1 голос
/ 28 мая 2020

У меня есть фрейм данных, который выглядит следующим образом:

state  year  value
1      1980  4
1      1981  5
1      1982  4
2      1980  2
2      1981  3
2      1982  4
100    1980  3
100    1981  2
100    1982  5

В фактическом наборе данных имеется больше состояний, чем показано здесь. Я хотел бы провести сравнение между состоянием 100 и всеми другими состояниями.

В частности, для каждого штата я хотел бы найти разницу между значением, заданным этим штатом для конкретного года, и значением, заданным для состояния 100 для того же года. Ниже я показал, как я могу сравнить значение за 1980 год между состоянием 1 и состоянием 100.

df_1 <- df %>% filter(state == 1) 
df_100 <- df %>% filter(state == 100)
df_1_1980 <- df_1 %>% filter(year == 1980) 
df_100_1980 <- df_100 %>% filter(year == 1980)
difference <- df_1_1980$value - df_100_1980$value

Как я могу сделать это для всех других состояний и лет во фрейме данных?

Одна возможность, которую я рассмотрел, - это создание фрейма данных, состоящего только из данных из состояния 100, а затем подключение его к исходному фрейму данных, например:

state  year  value  state100  year100  value100
1      1980  4      100       1980     3
1      1981  5      100       1981     2
1      1982  4      100       1982     5
2      1980  2      100       1980     3
2      1981  3      100       1981     2
2      1982  4      100       1982     5

Затем я мог бы вычесть df $ значение из df $ value100 для каждой строки. Я предполагаю, что есть лучший способ сделать это.

1 Ответ

1 голос
/ 28 мая 2020

Мы можем filter 'состояние', которое не равно 100, left_join с набором данных с 'состоянием' 100, by 'год' и получить разницу между столбцами 'значения'

library(dplyr)
df %>% 
   filter(state != 100) %>% 
   left_join(df %>%
                filter(state == 100) %>% 
                select(-state), by = c('year')) %>% 
   transmute(state, year, value = value.x, difference = value.x - value.y)
#  state year value difference
#1     1 1980     4          1
#2     1 1981     5          3
#3     1 1982     4         -1
#4     2 1980     2         -1
#5     2 1981     3          1
#6     2 1982     4         -1

данные

df <- structure(list(state = c(1L, 1L, 1L, 2L, 2L, 2L, 100L, 100L, 
100L), year = c(1980L, 1981L, 1982L, 1980L, 1981L, 1982L, 1980L, 
1981L, 1982L), value = c(4L, 5L, 4L, 2L, 3L, 4L, 3L, 2L, 5L)), 
class = "data.frame", row.names = c(NA, 
-9L))
...