使用"和#34;在数据框中使用条件在R中的功能

时间:2016-09-06 20:45:55

标签: r with-statement

我的数据如下:

 manager     date country gender age q1 q2 q3 q4 q5 agecat
1       1 10/24/08      US      M  NA  5  4  5  5  5  NA
2       2 10.28/08      US      F  45  3  5  2  5  5  NA
3       3  10/1/08      UK      F  NA  3  5  5  5  2  NA
4       4 10/12/08      UK      M  39  3  3  4 NA NA  NA
5       5   5/1/09      UK      F  99  2  2  1  2  1  NA

现在我想设置agecat =" Elder"如果年龄> 55.我尝试了以下两组代码并得到了不同的结果:

代码1(工作)

leadership$agecat[leadership$age > 55] <- "Elder"

代码2 :(没有工作)

with(leadership, {
       agecat[age > 55] <- "Elder"
     })

任何人都可以帮助我理解两者之间的区别以及为什么第二个之间没有这样做的原因。工作?非常感谢!

2 个答案:

答案 0 :(得分:3)

首先,您的with表达式

                 { 
    agecat[age > 55] <- "Elder"
}

无形地返回结果,因为你还没有分配它,所以在任何地方都没有变化。有很多方法可以做到这一点,在这种情况下使用with实际上看起来有点笨重,因为你必须做以下事情。请注意,该列将在表达式的第二行返回。

leadership$agecat <- with(leadership, {
    agecat[age > 55] <- "Elder"
    agecat
})

不是真正简化的with来电,imo。你可以用

清理一下
leadership$agecat <- with(leadership, replace(agecat, age > 55, "Elder"))

基本上只是在函数中打包的东西。但您也可以使用within来更新数据并将其返回给您(因此我们需要分配结果)。

leadership <- within(leadership, agecat[age > 55] <- "Elder")

正如@BenBolker所说,transform是另一种选择。这也会提供完整的更新数据,与within相同。

leadership <- transform(leadership,agecat = replace(agecat, age > 55, "Elder"))

长话短说,最好坚持使用 Code 1 代码。

答案 1 :(得分:1)

with为数据框创建一个环境,这样您就不需要重新键入数据框名称来访问其中的变量。在您的情况下,您创建了一个变量,但是当您退出环境时它就消失了。因此,正如Dirty Sock Sniffer所说,使用within也会创建一个环境但返回数据框。因此,以下工作:

leadership <- within(leadership, agecat[age > 55] <- "Elder")