【问题标题】:Adding new column with conditional values using ifelse使用 ifelse 添加具有条件值的新列
【发布时间】:2016-09-16 04:53:30
【问题描述】:

我有一个包含超过 400.000 个观察值的数据框,我正在尝试向其中添加一列,其值取决于另一列,有时是多个列。

这是我正在尝试做的一个更简单的示例:

# Creating a data frame 

M <- data.frame(c("A","B","C"),c(5,100,60))

names(M) <- c("Letter","Number")

#adding a column 

M$Size <- NA

# if Number <= 50 Size is small, 
# if Number is between 50 and 70, Size is Medium
# if Number is Bigger than 70, Size is Big

ifelse (M$Number <=50, M$Size <-"Small",
        ifelse(M$Number <= 70,
        M$Size <- "Medium",
        M$Size <- "Big"
        ))

当我运行代码时,我得到的输出是:

[1] "Small"  "Big"    "Medium"

但 M 中的“Size”列始终是 ifelse 函数中的最后一个条件:

> print (M)
  Letter Number Size
1      A      5  Big
2      B    100  Big
3      C     60  Big

我想要的结果:

> print (M)
  Letter Number Size
1      A      5  Small
2      B    100  Big
3      C     60  Medium

我可以通过子集每个条件subset 并使用rbind 来获得我想要的结果来解决问题,但是代码会很长,而且由于我正在处理的原始数据框很大,它会需要更多的时间来运行。所以我想知道如何解决这个问题?

【问题讨论】:

  • cut(M[, 2], c(-Inf, 50,70, Inf), c("Small", "Medium", "Big"))

标签: r if-statement dataframe conditional-statements


【解决方案1】:

使用cut:

M$Size <- cut(M$Number, breaks = c(-Inf, 50, 70, Inf), 
                        labels = c("small", "medium", "large"))
#   etter Number   Size
#1      A      5  small
#2      B    100  large
#3      C     60 medium

【讨论】:

    【解决方案2】:

    这将帮助你 -

    # Creating a data frame 
    
    M <- data.frame(c("A","B","C"),c(5,100,60))
    
    names(M) <- c("Letter","Number")
    
    #adding a column 
    
    
    # if Number <= 50 Size is small, 
    # if Number is between 50 and 70, Size is Medium
    # if Number is Bigger than 70, Size is Big
    
    # M$Size[M$Number <= 50] <- "Small"
    # Edit: No need to subset "Small"
    M$Size <- "Small"
    M$Size[M$Number >50 & M$Number<70] <- "Medium"
    M$Size[M$Number > 70] <- "Big"
    
    #      Letter Number   Size
    # 1      A      5      Small
    # 2      B    100      Big
    # 3      C     60      Medium
    

    R-Fiddle上看到这个

    【讨论】:

    • 这比使用ifelse 更好。投赞成票。但是,如果没有 NA 值,则不需要在第一步中进行子集设置。只需M$Size &lt;- "Small"
    • @Roland 是的,你是对的,我监督了这一点。将编辑
    【解决方案3】:

    同样的想法,但改为这样分配。无需打包。

    M$Size <- ifelse(M$Number <= 50, 'Small', ifelse(M$Number <= 70, 'Medium', 'Big'))
    

    结果:

      Letter Number   Size
    1      A      5  Small
    2      B    100    Big
    3      C     60 Medium
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多