从最接近给定列的列中按行选择非缺失值

时间:2018-10-06 11:44:37

标签: r dataframe

我在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 :(得分:0)

首先,让我们看一下您的数据:

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