2017-11-11 140 views
0

嗨失踪我想使用的R滤光器与选定的COUNTRYCODE过滤所有的行,并与continuous year from 1950 to 2014数据就像过滤器导致的数据中的R

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 

为EV有效的时间序列数据每10年过滤一次,这是我选择的逻辑变量的确切数字。

这是怎么发生的以及任何修复它的方法?

+4

使用'%in%'而不是'==' – Sotos

回答

7

为什么要在%中使用%not ==?

我们来看看==%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( “USA”, “CHN”, “GBR”):较长 对象长度不短对象长度的倍数

的结果可能看起来不错,但要注意警告信息。事实证明,当使用==来比较两个向量时,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

+2

真棒,很好,明确的细节是美好的! – exteralvictor