使用lappy和elseif命令

时间:2014-08-17 14:24:28

标签: r if-statement lapply

使用R我有一张桌子,让我们说' locations'

head(locations, n=10)
       apillar fender fwheel fdoor compart rdoor rwheel boot
1        0      0      0     0       0     0      0    1
2        0      0      0     1       0     0      0    0
3        0      0      0     0       1     0      0    0
4        0      1      0     0       0     0      0    0
5        1      0      1     0       0     0      0    0
6        1      0      0     1       0     0      0    0
7        0      0      0     0       0     0      0    0
8        0      0      0     0       1     0      0    0
9        0      0      0     1       0     0      0    0
10       0      0      0     0       0     1      0    0

现在我想创建一个新的变量" cat"它将影响分组到类别位置。 我一直在使用if,elseif和else命令,但我无法让它工作。 命令是:

cat <- lapply(locations, function(x) if (apillar|fender|fwheel == 1)print("front") else if (fdoor|compart|rdoor == 1)print("middle") else if(rwheel|boot ==1)print("rear") else print("NA")

这样猫应该读后,中,中,中,前等

2 个答案:

答案 0 :(得分:1)

当涉及TRUEFALSE语句的向量时,我通常不希望使用if来避免循环。在这种情况下,我发现条件引用更优雅。见下文。

locations <- read.table(header=TRUE, text=
"apillar fender fwheel fdoor compart rdoor rwheel boot
1        0      0      0     0       0     0      0    1
2        0      0      0     1       0     0      0    0
3        0      0      0     0       1     0      0    0
4        0      1      0     0       0     0      0    0
5        1      0      1     0       0     0      0    0
6        1      0      0     1       0     0      0    0
7        0      0      0     0       0     0      0    0
8        0      0      0     0       1     0      0    0
9        0      0      0     1       0     0      0    0
10       0      0      0     0       0     1      0    0")

locations$cat <- NA

within(locations,{
  cat[apillar|fender|fwheel] <- "front"
  cat[fdoor|compart|rdoor] <- "middle"
  cat[rwheel|boot] <- "rear"
})

结果:

   apillar fender fwheel fdoor compart rdoor rwheel boot    cat
1        0      0      0     0       0     0      0    1   rear
2        0      0      0     1       0     0      0    0 middle
3        0      0      0     0       1     0      0    0 middle
4        0      1      0     0       0     0      0    0  front
5        1      0      1     0       0     0      0    0  front
6        1      0      0     1       0     0      0    0 middle
7        0      0      0     0       0     0      0    0   <NA>
8        0      0      0     0       1     0      0    0 middle
9        0      0      0     1       0     0      0    0 middle
10       0      0      0     0       0     1      0    0 middle

干杯!

答案 1 :(得分:0)

更正了您自己的代码:

locations$cat= with(locations, ifelse(apillar|fender|fwheel, "front", ifelse(fdoor|compart|rdoor,"middle",ifelse(rwheel|boot, "rear", "NA"))) )
> locations
   apillar fender fwheel fdoor compart rdoor rwheel boot    cat
1        0      0      0     0       0     0      0    1   rear
2        0      0      0     1       0     0      0    0 middle
3        0      0      0     0       1     0      0    0 middle
4        0      1      0     0       0     0      0    0  front
5        1      0      1     0       0     0      0    0  front
6        1      0      0     1       0     0      0    0  front
7        0      0      0     0       0     0      0    0     NA
8        0      0      0     0       1     0      0    0 middle
9        0      0      0     1       0     0      0    0 middle
10       0      0      0     0       0     1      0    0 middle
>