【问题标题】:Conditional statments in r in two columns两列中的条件语句
【发布时间】:2015-03-03 18:38:57
【问题描述】:

我有两列,weightarea。我想创建如下两列:

  1. out1:如果weight > 12,则向上,否则向下。
  2. out2:如果area > -0.5,则插入值 0。否则,将 area 的绝对值与 0.5 映射四舍五入为 1。

期望的输出:

       weight   area    out1    out2
           12      3    down       0
           13   -0.4     top       0
           11    2.5    down       0
           17   -0.5     top       1
           16   -3.7     top       4
           14   -1.2     top       1
           11   -4.8    down       5

【问题讨论】:

  • 你可以在这里试试ifelse
  • 我尽力了,但没有成功。你能帮忙吗?
  • 我在下面发布了一个解决方案。您也可以在base R 中使用transformwithin 进行此操作
  • 你能在不使用包的情况下给我代码吗
  • 您能否在问题中也包含您尝试过的内容?

标签: r


【解决方案1】:

试试

transform(df, out1=c('down', 'top')[(weight>12)+1L], 
                   out2= ifelse(area >-0.5, 0, abs(round2(area,0))))
#   weight area out1 out2
#1     12  3.0 down    0
#2     13 -0.4  top    0
#3     11  2.5 down    0
#4     17 -0.5  top    1
#5     16 -3.7  top    4
#6     14 -1.2  top    1
#7     11 -4.8 down    5

或者

library(data.table)
setDT(df)[, paste0('out',1:2) := list(c('down', 'top')[(weight>12)+1L],
               ifelse(area > -0.5, 0, abs(round2(area,0))))][]

round2 在哪里(取自Round up from .5 in R

  round2 = function(x, n) {
  posneg = sign(x)
  z = abs(x)*10^n
  z = z + 0.5
  z = trunc(z)
  z = z/10^n
  z*posneg
   }

【讨论】:

  • 我认为这不会将 -0.5 舍入到 -1 是否正确...请参阅 stackoverflow.com/questions/12688717/round-up-from-5-in-r
  • @jalapic 是的,链接中的round2 在这里给出了预期的结果
  • 你能提供代码吗,我使用了那个链接,但我得到了错误
  • @user2684423 更新了帖子
【解决方案2】:

这是我使用data.table 的方法:

require(data.table)
dt[, out1 := "down"][weight > 12, out1 := "top"]
dt[, out2 := floor(abs(area)+0.5)][area > -0.5, out2 := 0]
#    weight area out1 out2
# 1:     12  3.0 down    0
# 2:     13 -0.4  top    0
# 3:     11  2.5 down    0
# 4:     17 -0.5  top    1
# 5:     16 -3.7  top    4
# 6:     14 -1.2  top    1
# 7:     11 -4.8 down    5

【讨论】:

    【解决方案3】:
    df <- data.frame(weight= c(12, 13, 11, 17, 16, 14, 11),
                     area  = c(3, -0.4, 2.5, -0.5, -3.7, -1.2, -4.8))
    
    df$out1 <- ifelse(df$weight > 12, "top", "down")
    df$out2 <- ifelse(df$area > -0.5, 0, floor(0.5 + abs(df$area)))
    
    df
    
    #   weight area out1 out2
    # 1     12  3.0 down    0
    # 2     13 -0.4  top    0
    # 3     11  2.5 down    0
    # 4     17 -0.5  top    1
    # 5     16 -3.7  top    4
    # 6     14 -1.2  top    1
    # 7     11 -4.8 down    5
    

    【讨论】:

    • 什么类型的错误?只是在一个干净的会话中运行它,我没有问题吗?
    • out 2- 我收到 000000 -2 -2-2-2 00000
    • 我想我在质疑您是如何尝试“四舍五入”的——-0.5 如何映射到 +1?
    • -0.5 和 -1.00 之间的值将得到 1。感谢您的帮助 Jason
    • 我认为如果我们将负值转换为正值,这将得到解决。可以试试吗?
    猜你喜欢
    • 1970-01-01
    • 2021-12-09
    • 2011-08-27
    • 1970-01-01
    • 2021-05-09
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多