Статистика R, данные панели и NA: замена значения NA в векторе указанной строкой c в другом векторе с использованием данных панели - PullRequest
0 голосов
/ 08 февраля 2020

Мои извинения за плохо сформулированный вопрос. Я новичок в R и в программировании и для публикации вопросов.

Я работаю с данными панели. У меня есть две переменные, зависящие от контекста: cat (категория от 1 до 4, где человек играл в 3 из 4 возможных мест) и d.stake = сумма денег, поставленная в данной категории. Cat и d.stake вложены в индивида (id) (контекстно-независимая переменная).

I w * sh, чтобы получить разницу между количеством разных категорий в разных категориях.

Я создал четыре переменные. Два из них запаздывают - это переменная запаздывания (ldstake и ldstake2) и две переменные с оценками разности (diff1 = кол - ldstake; diff2 кол - ldstake2) с использованием кода

df.3$ldstake <- c(NA, df.3$d.stake[-nrow(df.3)])
df.3$ldstake[which(!duplicated(df.3$id))] <- NA


df.3$ldstake2 <- c(NA, df.3$ldstake[-nrow(df.3)])
df.3$ldstake2[which(!duplicated(df.3$id))] <- NA


df.3 <- df.3 %>%
 mutate(diff1 = d.stake - ldstake,
     diff2 = d.stake - ldstake2)

Это дает мне следующий кадр данных :

id cat d.stake ldstake ldstake2 diff1 diff2
1   1    50      NA       NA     NA     NA
1   2    60      50       NA     10     NA
1   3    55      60       50     -5     5
2   1    34      NA       NA     NA     NA
2   2    74      34       NA     40     NA
2   4    12      74       34     -62    22

Тем не менее, я буду sh, чтобы заменить первый ряд diff1 (NA) для каждого человека на третий ряд diff2 от каждого человека (см. Пример ниже).

id cat d.stake ldstake ldstake2 diff1 diff2
1   1    50      NA       NA     !5!    NA
1   2    60      50       NA     10     NA
1   3    55      60       50     -5     !5!
2   1    34      NA       NA    *22*    NA
2   2    74      34       NA     40     NA
2   4    12      74       34    -62    *22*

Возможно ли это? Я был бы признателен за получение сценария, в котором я могу заменить первое значение NA на значение diff2 и последнее значение для человека (третье или последнее наблюдение). Кроме того, если есть сценарий, который сделает это автоматически (то есть создаст разницу между cat2-1, cat3-2 и cat3-1), я был бы благодарен за любую помощь.

Всего наилучшего, Tony

1 Ответ

0 голосов
/ 08 февраля 2020

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

library(tidyverse)

df_wide <- df %>%
  pivot_wider(id_cols = id, names_from = cat, values_from = d.stake) %>%
  as.data.frame(.)

data.frame(id = df_wide$id, combn(df_wide[-1], 2, function(x) x[,1]-x[,2])) %>%
  setNames(c("id", apply(combn(names(df_wide[-1]), 2), 2, paste0, collapse = "-"))) %>%
  pivot_longer(cols = -id, names_to = "cats", values_to = "diff") %>%
  drop_na()

Вывод

# A tibble: 6 x 3
     id cats   diff
  <dbl> <chr> <dbl>
1     1 1-2     -10
2     1 1-3      -5
3     1 2-3       5
4     2 1-2     -40
5     2 1-4      22
6     2 2-4      62

Данные

df <- data.frame(
  id = c(1,1,1,2,2,2),
  cat = c(1,2,3,1,2,4),
  d.stake = c(50,60,55,34,74,12)
)
...