使用 ifelse 添加具有条件值的新列

Nou*_*Nou 5 if-statement r conditional-statements dataframe

我有一个包含超过 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"
        ))
Run Code Online (Sandbox Code Playgroud)

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

[1] "Small"  "Big"    "Medium"
Run Code Online (Sandbox Code Playgroud)

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

> print (M)
  Letter Number Size
1      A      5  Big
2      B    100  Big
3      C     60  Big
Run Code Online (Sandbox Code Playgroud)

我想要的结果:

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

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

PRY*_*RYM 10

这将帮助你 -

# 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
Run Code Online (Sandbox Code Playgroud)

R-Fiddle上看到这个

  • 这比使用 `ifelse` 更好。点个赞吧。但是,如果没有“NA”值,则不需要第一步中的子集。只需执行`M$Size &lt;- "Small"`。 (2认同)

Rol*_*and 7

使用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
Run Code Online (Sandbox Code Playgroud)


ele*_*lar 6

相同的想法,但像这样分配它。无需包装。

M$Size <- ifelse(M$Number <= 50, 'Small', ifelse(M$Number <= 70, 'Medium', 'Big'))
Run Code Online (Sandbox Code Playgroud)

结果:

  Letter Number   Size
1      A      5  Small
2      B    100    Big
3      C     60 Medium
Run Code Online (Sandbox Code Playgroud)