我在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。
对于比利时,我不在乎,我们可以选择最大或最小的一个。
答案 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