说我有下表
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
我想为Door
或seat values = 0
或2
我想为Door
或seat 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值。
答案 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"))