在 R 中使用 "with" 函数在数据框中使用条件

use condition in data frame with "with" function in R

我的数据是这样的:

 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" if age > 55。我尝试了以下两组代码并得到了不同的结果:

代码 1(有效)

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

代码 2:(无效)

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

任何人都可以帮助我了解两者之间的区别以及为什么第二个不起作用?非常感谢!

首先,你的 with 表达式

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

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

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

不是真正精简的 with 调用,imo。你可以用

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

这基本上是相同的东西,只是封装在一个函数中。但您也可以使用 within,它会更新数据并将 returns 返回给您(因此我们需要分配结果)。

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

正如@BenBolker 指出的那样,transform 是另一种选择。这也会返回完整的更新数据,与 within.

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

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

with 为数据框创建一个环境,因此您无需重新键入数据框名称即可访问其中的变量。在你的例子中,你创建了一个变量,但当你退出环境时它就消失了。因此,正如 Dirty Sock Sniffer 所说,使用 within 也会创建一个环境,但 returns 数据框。因此以下作品:

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