在r中使用命令来定义类别

时间:2014-08-18 13:19:33

标签: r

说我有下表

Airbag <- read.table(header=TRUE, text=
"      Door  Seat 
1        0      1
2        2      0      
3        1      0     
4        0      1    
5        1      0 
6        1      0
7        0      0
8        0      0
9        0      2
10       0      0")

现在我介绍变量'ab.usage'

Airbag$ab.usage <- NA

我想为Doorseat values = 02

的案例定义“否”

我想为Doorseat values = 1

的案例定义'是'

我一直在努力使用within()命令。这样

within(Airbag,{
   ab.usage[Door|Seat == 0|2] <- "no"
   ab.usage[Door|Seat == 1] <- "yes"
   })

以及

within(Airbag,{
       ab.usage[Door|Seat == 0] <- "no"
       ab.usage[Door|Seat == 1] <- "yes"
       ab.usage[Door|Seat == 2] <- "no"
       })

但两者都没有改变Airbag$ab.usage中的NA值。

2 个答案:

答案 0 :(得分:0)

请参阅命令within的帮助:

  

'within'是相似的,只是它在评估'expr'之后检查环境并对'data'的副本进行相应的修改(如果创建的对象不能是数据框,则可能会失败存储在数据框中),并返回它。 'within'可以用来替换'transform'。

由于返回了数据框的修改副本,您只需将其存储在新名称下:

   Airbag.new <- within(Airbag,{
     ab.usage[Door %in% c(0, 2) | Seat %in% c(0, 2)  ] <- "no"
     ab.usage[Door == 1 | Seat == 1] <- "yes"
   })

我冒昧地修改了第一个提议的例子,因为它看起来很可疑。它甚至看起来像这里所做的是,如果Door = 1或Seat = 1但不是两者都是= 1,那么ab.usage应该是&#39; true&#39;。如果我的解释是正确的,那么一个简单的xor就可以完成这项任务(我使用@Roland推荐的ifelse):

   Airbag.new <- within(Airbag,{
     ab.usage <- ifelse( xor(Door==1, Seat==1), "yes", "no")
   })

结果很短,很容易避免使用within

答案 1 :(得分:0)

如果您已经知道这些值将会是什么,和/或如何到达它们,请不要创建包含NA值的新列。它只意味着更多的内存使用和复制。

我建议只做

Airbag$ab.usage <- with(Airbag, ifelse(Door == 1 | Seat == 1, "yes", "no"))