R 使用if-else循环时出现错误“条件的长度大于1,且仅使用第一个元素”
我是一个R新手,尝试创建一个新的列,从现有的12小时列格式中提取时间数据并简化它。例如,将12:45改为12点,将4:00改为4点,等等 以下是我所拥有的:R 使用if-else循环时出现错误“条件的长度大于1,且仅使用第一个元素”,r,stringr,R,Stringr,我是一个R新手,尝试创建一个新的列,从现有的12小时列格式中提取时间数据并简化它。例如,将12:45改为12点,将4:00改为4点,等等 以下是我所拥有的: df <- df %>% mutate(NewTimeColumn = if (str_detect(OldTimeColumn, "^12") == TRUE) { "12" } else if (str_detect(OldTimeColumn, "^1") == TRUE) { "1" } else if (str_de
df <- df %>%
mutate(NewTimeColumn = if (str_detect(OldTimeColumn, "^12") == TRUE) {
"12"
} else if (str_detect(OldTimeColumn, "^1") == TRUE) {
"1"
} else if (str_detect(OldTimeColumn, "^2") == TRUE) {
"2"
} else if (str_detect(OldTimeColumn, "^3") == TRUE) {
"3"
## and so on
} else {
"11"
})
如果在长度为1的逻辑条件下使用if和else,则新列中的所有值最终都为1。您正在询问长度为n的向量OldTimeColumn是否等于单个值为TRUE的向量-这就是为什么警告消息会这样说,并且它只通过将OldTimeColumn的第一个元素与TRUE进行比较来计算它的值
对于您的特定示例,更好的方法可能是使用该结构
library(dplyr)
library(stringr)
df <- data.frame(
OldTimeColumn = c("12", "1", "2", "3", "4"),
stringsAsFactors = F
)
df <- df %>%
mutate(NewTimeColumn = case_when(
str_detect(OldTimeColumn, "^12") ~ "12",
str_detect(OldTimeColumn, "^1") ~ "1",
str_detect(OldTimeColumn, "^2") ~ "2",
str_detect(OldTimeColumn, "^3") ~ "3",
TRUE ~ "11"
))
df
OldTimeColumn NewTimeColumn
1 12 12
2 1 1
3 2 2
4 3 3
5 4 11
if和else应在长度为1的逻辑条件上使用。您正在询问长度为n的向量OldTimeColumn是否等于单个值为TRUE的向量-这就是为什么警告消息会这样说,并且它只通过将OldTimeColumn的第一个元素与TRUE进行比较来计算它的值
对于您的特定示例,更好的方法可能是使用该结构
library(dplyr)
library(stringr)
df <- data.frame(
OldTimeColumn = c("12", "1", "2", "3", "4"),
stringsAsFactors = F
)
df <- df %>%
mutate(NewTimeColumn = case_when(
str_detect(OldTimeColumn, "^12") ~ "12",
str_detect(OldTimeColumn, "^1") ~ "1",
str_detect(OldTimeColumn, "^2") ~ "2",
str_detect(OldTimeColumn, "^3") ~ "3",
TRUE ~ "11"
))
df
OldTimeColumn NewTimeColumn
1 12 12
2 1 1
3 2 2
4 3 3
5 4 11
我很可能会使用lubridate来正确处理您的时间栏。下面是一个模型示例
数据
df我很可能会使用lubridate来正确处理您的时间列。下面是一个模型示例
数据
df友好提示:通过使用dput提供data.frame和您期望的输出外观,尝试使您的问题具有可复制性。友好提示:通过使用dput提供data.frame和您期望的输出外观,尝试使您的问题具有可复制性。
df <- df %>%
mutate(NewTimeColumn = ifelse(str_detect(OldTimeColumn, "^12") == TRUE,
"12", ifelse(str_detect(OldTimeColumn, "^1") == TRUE,
"1", ifelse(str_detect(OldTimeColumn, "^2") == TRUE,
"2", ifelse(str_detect(OldTimeColumn, "^3") == TRUE, "3", "11")))))