首页 > 解决方案 > 如果有任何值或列满足条件,则对值进行分类并保留 NA 值

问题描述

我试图找出我的任何列的值是否超过某个值,例如 7。如果是,则将其分类为more,否则为less。我的问题与此处的问题类似,但我不知道如何将其更新到我的情况。我需要按行对值进行分类。此外,某些行可以仅由 NA/NaN 值填充。我需要将它们保存在数据框中,因此我无法在计算之前过滤它们。

例子:

# Example: classify data if they fit the condition:
data <- data.frame(V1=c(1,5,7, NA),
                   V2=c(1,5,8, NA),
                   V3=c(3,9,10, NaN))


# Classify each column: 
ifelse(data$V1 >=7, "more", "less") 

# Classify based on all columns? NOT WORKING!
 data$NewCol <- +( Reduce(`|`, lapply(data, >=, 7)))

期望的结果:

  V1 V2 V3 newCol
1  1  1  3 less   # no value is >= 7
2  5  5  9 more
3  7  8 10 more
4 NA NA NaN NA

标签: rif-statementdplyr

解决方案


你可以使用rowSums-

data$newCol <- ifelse(rowSums(data >= 7) > 0, 'more', 'less')

或者如果我们有多个条件要检查,则使用dplyrwith 。case_when

library(dplyr)

data %>%
  rowwise() %>%
  mutate(newCol = case_when(all(is.na(c_across())) ~ NA_character_, 
                            any(c_across() >= 7) ~ 'more', 
                            TRUE ~ 'less'))

#     V1    V2    V3 newCol
#  <dbl> <dbl> <dbl> <chr> 
#1     1     1     3 less  
#2     5     5     9 more  
#3     7     8    10 more  
#4    NA    NA   NaN NA    

推荐阅读