【问题标题】:Conditional help ifelse statement条件帮助 ifelse 语句
【发布时间】:2021-01-24 19:25:50
【问题描述】:

对于数据集,我们有以下分段等式:

tenure_new == tenure iftenure <= exper 
tenure_new == exper iftenure> exper

所以我写的代码是:

tenure_new <- ifelse(wage2$tenure <= wage2$exper,wage2$tenure, wage2$exper)

我们想得到平均值,但我们得到的答案没有被接受——不知道还能做什么。

我不想要答案,只是一些关于我可能会忽略的方向。

这里是问题问题:

【问题讨论】:

  • 请提供minimal reproducible example。请参阅 How to make a great R reproducible example? 了解这在 R 中的含义。请注意,代码、数据或问题陈述的图像对其他人不是很有用。
  • tenure_new 的定义看起来不错。如果某些自动评分系统不接受其平均值的正确舍入值,则问题可能出在评分系统上。你的问题缺乏足够的背景。根据您提供的有限信息,无法真正回答。
  • 如果 round(mean(tenure_new), 2) 给你 6.51 那么问题不在于你。
  • 请显示您用来获取平均值的代码并说明该值是什么。

标签: r piecewise


【解决方案1】:

有多种方法可以做到这一点。但为了简单起见,我将展示带有 base R 的传统 for 循环方法,带有 base R 的 mapply 方法,并分享 tidyverse 方法。

基本 R 方法 - 使用 for 循环

library(wooldridge)

data(wage2)

# Traditional solution
# Make new variable
wage2$tenure_new<- NA

for(i in 1:length(wage2$tenure)){
  if(wage2$tenure[i]<= wage2$exper[i]){
    wage2$tenure_new[i]<- wage2$tenure[i]
  }else{
    wage2$tenure_new[i]<- wage2$exper[i]
  }
}

# mean of tenure_new
round(mean(wage2$tenure_new),2)
# Output> [1] 6.51

Base R 方法-使用mapply

代码量非常少,但如果您不太了解 R,则很难阅读。

round(mean(mapply(function(x,y) if(x<=y){x}else{y},x=wage2$tenure,y=wage2$exper)),2)

tidyverse接近

(实际上你可以单独使用dplyr 包,但我个人更喜欢完整加载tidyverse。)

library(tidyverse)

wage2 %>% 
  transmute(tenure_new=ifelse(tenure<=exper,tenure,exper)) %>% 
  colMeans() %>% 
  round(2)

# Output> tenure_new 
#               6.51

【讨论】:

  • 投反对票,因为您的 2 个基本 R 方法非常单调。它们是 OP 在问题中的代码效率较低的版本。在 R 中使用 for 循环而不是矢量化函数并没有什么“传统”。
  • @GregorThomas 你有权发表你的意见,但基本的 R 示例是我教育和提供直觉的尝试。
  • 那么我会期待一些评论,因为我不清楚你试图说明什么概念或这些例子提供了什么直觉...... for 循环可能是“如果你正在使用一种未矢量化的不同语言,您可能会以这种方式解决问题......”。 mapply 似乎是一种混淆问题中简单的ifelse(wage2$tenure &lt;= wage2$exper,wage2$tenure, wage2$exper) OP 帖子的方法?
  • 我并不是要刻薄,但是您的基本 R 示例似乎比 OP 在问题中的可读性和效率低。所以我真的很困惑你为什么要包括他们。
  • round(mean(mapply(function(x,y) if(x&lt;=y {x}else{y},x=wage2$tenure,y=wage2$exper)),2),你认为它是“非常少量的代码但难以阅读”并不像 OP 可读性很强的 ifelse(wage2$tenure &lt;= wage2$exper,wage2$tenure, wage2$exper) 那样短(当然,它可以被包裹在 @ 987654336@ 也很容易。在这种情况下,mapply 几乎肯定会比ifelse 有更多的开销,这也降低了效率。
猜你喜欢
  • 1970-01-01
  • 2011-03-20
  • 1970-01-01
  • 1970-01-01
  • 2011-12-13
  • 2021-11-27
  • 2011-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多