Выберите не пропущенные значения построчно из столбцов, ближайших к заданному столбцу - PullRequest
0 голосов
/ 06 октября 2018

У меня есть кадр данных в R, например:

  country X2005 X2006 X2007 X2008 X2009 X2010
1  France    NA    NA    NA    23    NA    NA
2   Italy    NA    NA    12    NA    NA    NA
3   Spain    12    NA    14    NA    NA    NA
4 Belgium    NA    NA    12    NA    18    NA

Я хотел бы создать новый столбец без NA в соответствии с:
(1) Если столбец "X2008" имеетне NA значение, выберите это значение.(2) Если значение «X2008» равно NA, возьмите значение из ближайшего столбца, который содержит значение.

Например, для Италии это будет 12, а для Испании - 14.
Для Бельгии мне все равно, мы можем взять самое большое или самое маленькое.

1 Ответ

0 голосов
/ 06 октября 2018

Во-первых, давайте посмотрим на ваши данные:

txt <- 'country X2005 X2006 X2007 X2008 X2009 X2010  
France NA NA NA 23 NA NA  
Italy NA NA 12 NA NA NA  
Spain 12 NA 14 NA NA NA  
Belgium NA NA 12 NA 18 NA'

df <- read.table(text = txt, header = T)

  country X2005 X2006 X2007 X2008 X2009 X2010
1  France    NA    NA    NA    23    NA    NA
2   Italy    NA    NA    12    NA    NA    NA
3   Spain    12    NA    14    NA    NA    NA
4 Belgium    NA    NA    12    NA    18    NA

Эти данные "широкие", с которыми может быть сложно работать.Сначала нам нужно подготовить данные.Мы изменим его, чтобы упростить работу, удалили пропущенные значения и вычислили, насколько близко каждое наблюдение к 2008 году:

library(tidyverse)

df <- df %>% 
  gather(year, value, -country) %>% 
  mutate(year = as.numeric(gsub('X', '', year))) %>% 
  mutate(dist.from.2008 = abs(year - 2008)) %>% 
  filter(!is.na(value))

  country year value dist.from.2008
1   Spain 2005    12              3
2   Italy 2007    12              1
3   Spain 2007    14              1
4 Belgium 2007    12              1
5  France 2008    23              0
6 Belgium 2009    18              1

Наконец, для каждой страны мы сохраняем один годзначение которого ближе всего к 2008 году:

df <- df %>% 
  group_by(country) %>% 
  filter(dist.from.2008 == min(dist.from.2008)) %>% 
  filter(row_number() == min(row_number()))

  country  year value dist.from.2008
  <fct>   <dbl> <int>          <dbl>
1 Italy    2007    12              1
2 Spain    2007    14              1
3 Belgium  2007    12              1
4 France   2008    23              0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...