过滤器导致R中缺少数据

时间:2017-11-11 11:40:56

标签: r filter dplyr

您好我想使用R中的过滤器来过滤所选国家/地区代码的所有行,而continuous year from 1950 to 2014的数据就像

  countrycode       country currency_unit year   rgdpe   rgdpo      pop      emp      avh
1         USA United States     US Dollar 1950 2279787 2274197 155.5635 62.83500 1983.738
2         USA United States     US Dollar 1951 2440076 2443820 158.2269 65.08094 2024.002
3         USA United States     US Dollar 1952 2530524 2526412 160.9597 65.85582 2020.183
4         USA United States     US Dollar 1953 2655277 2642977 163.6476 66.78711 2014.500
5         USA United States     US Dollar 1954 2640868 2633803 166.5511 65.59514 1991.019
6         USA United States     US Dollar 1955 2844098 2834914 169.5189 67.53133 1997.761

我的代码是:

dat_10 <- filter(data_all_country,countrycode == c("USA","CHN","GBR","IND","JPN","BRA","ZAF","FRA","DEU","ARG"))

令人惊奇的是dat_10如下:

  countrycode   country  currency_unit year     rgdpe     rgdpo      pop       emp
1         ARG Argentina Argentine Peso 1954  51117.46  51031.80 18.58889  6.970472
2         ARG Argentina Argentine Peso 1964  69836.62  68879.08 21.95909  7.962999
3         ARG Argentina Argentine Peso 1974 113038.73 110358.46 25.64450  9.135211
4         ARG Argentina Argentine Peso 1984 148994.61 149928.59 29.92091 10.345933
5         ARG Argentina Argentine Peso 1994 379470.19 372903.00 34.55811 12.075872
6         ARG Argentina Argentine Peso 2004 517308.94 499958.94 38.72878 14.669195

因为即使有效的时间序列数据每10年被过滤一次,这是我选择作为逻辑变量的国家的确切数字。

这是如何发生的以及任何修复方法?

1 个答案:

答案 0 :(得分:7)

我们为什么要使用%in%= =?

让我们更详细地看一下==%in%之间的区别。

假设我们有一个矢量看起来像这样。

sample_vec <- c("USA", "CHN", "GBR", "IND", "JPN", "BRA", "USA", "CHN", "GBR")

我们要在向量中返回所有USACHNGBR的内容。所需的输出是这样的,这对于子集化或过滤非常有用。

#[1]  TRUE  TRUE  TRUE FALSE FALSE FALSE  TRUE  TRUE  TRUE

如果我们将==c("USA", "CHN", "GBR")一起使用,我们可以获得以下内容。

sample_vec == c("USA", "CHN", "GBR")
#[1]  TRUE  TRUE  TRUE FALSE FALSE FALSE  TRUE  TRUE  TRUE

看起来不错?等等,这不符合我们的想法。

让我们使用一个新的国家/地区代码测试此代码到原始向量。

# Add one more country
sample_vec2 <- c(sample_vec, "IND")
sample_vec2 ==  c("USA", "CHN", "GBR")
#[1]  TRUE  TRUE  TRUE FALSE FALSE FALSE  TRUE  TRUE  TRUE FALSE
  

警告信息:在sample_vec2 == c(&#34; USA&#34;,&#34; CHN&#34;,&#34; GBR&#34;):更长   对象长度不是较短对象长度的倍数

结果可能看起来不错,但要注意警告信息。事实证明,当使用==来比较两个向量时,R 将短元素再循环到长元素。上面的代码正在做如下的事情。每对角色都要单独评估。

Position  1     2     3     4     5     6     7     8     9    10 
Vector1 "USA" "CHN" "GBR" "IND" "JPN" "BRA" "USA" "CHN" "GBR" "IND" 
Vector2 "USA" "CHN" "GBR" "USA" "CHN" "GBR" "USA" "CHN" "GBR" "USA"
Result   TRUE  TRUE  TRUE FALSE FALSE FALSE  TRUE  TRUE  TRUE FALSE

如果它们相同,则评估Vector1Vector2上的字符串Position 1。如果它们相同,则返回TRUE,否则返回FALSE,然后转到Position 2,依此类推。这就是为什么会有一条警告信息。 sample_vec2的长度为10,而目标向量的长度仅为3.因此,R需要回收目标向量中的元素以进行一对一比较。

现在,如果我们在使用==时意识到R正在进行循环和一对一的比较,很明显,如果我们想要在向量中过滤元素,那么它就不合适了。让我们看看下面的例子。

sample_vec == c("CHN", "GBR", "USA")
#[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE

代码与sample_vec == c("USA", "CHN", "GBR")几乎相同,只不过我更改了国家/地区代码的顺序。但它返回所有FALSE!这是因为回收和一对一比较发现任何位置都不相同。这可能不是我们想要的结果。

但是,如果我们使用以下代码。

sample_vec %in% c("CHN", "GBR", "USA")
#[1]  TRUE  TRUE  TRUE FALSE FALSE FALSE  TRUE  TRUE  TRUE

返回预期结果。这是因为%in%是R中match函数的接口。如果匹配存在与否,则返回TRUEFALSE