我有以下代码,但会引发以下错误:
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))