【问题标题】:use condition in data frame with "with" function in R在数据框中使用条件与 R 中的“with”函数
【发布时间】:2016-09-06 20:45:54
【问题描述】:

我的数据如下所示:

 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"
     })

谁能帮我理解两者之间的区别以及为什么第二个不起作用?非常感谢!

【问题讨论】:

  • 如果您要对连续变量进行分类,还请查看 cut() 函数。
  • ...并且不要忘记使用within 将结果分配回leadership ...或尝试transform ...

标签: r with-statement


【解决方案1】:

首先,你的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"))

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

【讨论】:

  • ...leadership &lt;- transform(leadership,agecat = replace(agecat, age &gt; 55, "Elder"))
  • 欣赏提供的不同选项。一切正常。这是很大的帮助,谢谢大家的回答!
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2021-11-19
    • 2020-03-30
    • 1970-01-01
    • 2016-03-13
    • 2021-09-18
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多