如何翻译此子集代码:carrier [carriers [,1] ==“NW”,]

时间:2015-08-21 02:05:55

标签: r

载波是一个数据帧,有1491个/有两个变量的观测值

>str(carriers)

'data.frame':   1491 obs. of  2 variables:
 $ Code       : Factor w/ 1490 levels "02Q","04Q","05Q",..: 1 2 3 4 5 6 7 8 9 10 ...
 $ Description: Factor w/ 1491 levels "40-Mile Air",..: 1328 1331 479 887 620 1296 523 12 876 752 ...

然后我们提取对应于描述的因子:Northwest Airlines Inc.,它对应于使用以下变量Code的因子NW:

> carriers[carriers[,1] == "NW", ]
    Code             Description
NA  <NA>                    <NA>
921   NW Northwest Airlines Inc.

就在我认为自己掌握了子集时,我无法翻译这个简单的代码。我知道[carriers[,1]=="NW", ]发生的事情并不清楚。

注意:

> carriers[921,2]
[1] Northwest Airlines Inc.
1491 Levels: 40-Mile Air A/S Conair AAA-Action Air Carrier Inc. ... Zuliana De Aviacion

carriers[carriers[,1] == "NW", ]如何说:如果第一列是“NW”,请在数据帧载体中给我第二列。第一部分,是否说:所有(第1)列的行等于“NW”? 然后在RHS上为什么,在“NW”之后。

1 个答案:

答案 0 :(得分:3)

我猜你在载体[,1]列中有NA个值,这会通过子集化产生额外的NA行。尝试添加条件& !is.na(carriers[,1])

carriers[carriers[,1] == "NW" & !is.na(carriers[,1]), ]

使用可重现的例子

carriers <- data.frame(Code=c('NW', NA, 'SW'), 
   Description = c('Northwest Airlines Inc.', '', 'Southwest Airlines Inc.'))
 carriers[carriers[,1] == "NW", ]
 #   Code             Description
 #1    NW Northwest Airlines Inc.
 #NA <NA>                    <NA>

使用更正的条件

 carriers[carriers[,1] == "NW" & !is.na(carriers[,1]), ]
 #  Code             Description
 #1   NW Northwest Airlines Inc.

为什么我们要获得NA行?

我们可以检查逻辑条件的输出

 carriers[,1] == "NW"
 #[1]  TRUE    NA FALSE

如果有NA个值,则返回NA而不是TRUE/FALSE。在子集化期间,我们从上面的条件中获取对应于TRUE值的行,此外还为NA返回值创建了NA行。

补救措施是寻找“NW”并且不是NA的值。

 carriers[,1] == "NW" & !is.na(carriers[,1])
 #[1]  TRUE FALSE FALSE