В аккуратном фрейме данных копируйте значения из одного наблюдения в другое - PullRequest
0 голосов
/ 22 марта 2020

У меня есть фрейм данных, который содержит информацию для разных стран, дней и переменных. У меня есть наблюдения только для одной из этих переменных. Простой рабочий пример будет выглядеть так:

df <- data.frame(country=c("NL","NL","NL","NL","BE","BE","BE","BE"),
                 day=c("Monday","Monday","Tuesday","Tuesday","Monday","Monday","Tuesday","Tuesday"),
                 variable=c("A","B","A","B","A","B","A","B"),
                 value=c(8,NA,13,NA,12,NA,9,NA))
> df
  country     day variable value
1      NL  Monday        A     8
2      NL  Monday        B    NA
3      NL Tuesday        A    13
4      NL Tuesday        B    NA
5      BE  Monday        A    12
6      BE  Monday        B    NA
7      BE Tuesday        A     9
8      BE Tuesday        B    NA

Я хочу скопировать эти наблюдения в другую переменную, если country и day идентичны. Конечный результат будет выглядеть так:

> df
  country     day variable value
1      NL  Monday        A     8
2      NL  Monday        B     8
3      NL Tuesday        A    13
4      NL Tuesday        B    13
5      BE  Monday        A    12
6      BE  Monday        B    12
7      BE Tuesday        A     9
8      BE Tuesday        B     9

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

Ответы [ 2 ]

2 голосов
/ 22 марта 2020

Возможно, вы могли бы просто сделать:

library(dplyr)

df %>%
  group_by(country, day) %>%
  mutate(value = value[!is.na(value)])

Вывод:

# A tibble: 8 x 4
# Groups:   country, day [4]
  country day     variable value
  <fct>   <fct>   <fct>    <dbl>
1 NL      Monday  A            8
2 NL      Monday  B            8
3 NL      Tuesday A           13
4 NL      Tuesday B           13
5 BE      Monday  A           12
6 BE      Monday  B           12
7 BE      Tuesday A            9
8 BE      Tuesday B            9

Другой путь был бы через fill, хотя это, вероятно, не нужно (если необходимо, лучше использовать mutate(value = zoo::na.locf(value)) как последняя строка с самого медленного fill):

library(tidyverse)

df %>%
  group_by(country, day) %>%
  arrange(country, day, value) %>%
  fill(value)
1 голос
/ 22 марта 2020

С data.table мы можем сделать

library(data.table)
setDT(df)[, value := na.omit(value), .(country, day)]

Или с помощью na.locf

library(zoo)
setDT(df)[, value := na.locf0(value), .(country, day)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...