我的数据如下:
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"
})
任何人都可以帮助我理解两者之间的区别以及为什么第二个之间没有这样做的原因。工作?非常感谢!
答案 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")