R-根据逻辑向量应用功能

  • 本文关键字:向量 应用 功能 r
  • 更新时间 :
  • 英文 :


我有以下代码,但会引发以下错误:

the condition has length > 1 and only the first element will be used

显然这意味着我正在滥用if (condition) {action}构造,因此我正在寻找一种更优雅的方法来做到这一点:

if (grepl("Spring", data$Survey)) {data["Season"] <- "Spring"}
if (grepl("Summer", data$Survey)) {data["Season"] <- "Summer"}
if (grepl("Fall", data$Survey)) {data["Season"] <- "Fall"}

基本上,我想输入一个逻辑向量,对于每个TRUE,将函数应用于相同长度的数据集(在这种情况下,将字符串值分配给数据帧的该行(。

您可以使用 e.g。 stringr::str_extract的一步进行此操作。如果没有匹配,它将返回<NA>

library(dplyr)
library(stringr)
data <- data.frame(Survey = sample(c("it's Spring yay",
                                     "it's Summer yay",
                                     "it's Fall yay"),
                            20, replace = TRUE))
data <- data %>% 
  mutate(Season = str_extract(Survey, "(Spring|Summer|Fall)"))

您可以使用 ifelse而不是 if

data$Season <- ifelse(grepl("Spring", data$Survey), 
                         "Spring", 
                         ifelse(grepl("Summer", data$Survey), 
                                "Summer",  
                                ifelse(grepl("Fall", data$Survey), 
                                       "Fall",
                                       "Winter")))

对于data$Survey的每个元素:第一个ifelse将检查它是否包含" Spring",然后将其分配给data$Season中的相应项目,否则第二Ifelse将检查它是否包含" summer" ...

我们可以使用base R进行此

data$Season <-  regmatches(data$Survey, regexpr("\b(Spring|Survey|Fall)\b", data$Survey))
data$Season
#[1] "Spring" "Spring" "Fall"   "Fall"   "Spring" "Spring" "Fall"   "Spring" "Fall"   "Spring" "Spring"
#[12] "Fall"   "Spring" "Fall"  

数据

data <- data.frame(Survey = sample(c("it's Spring yay",
                                 "it's Summer yay",
                                 "it's Fall yay"),
                        20, replace = TRUE))

最新更新