Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 使用if-else循环时出现错误“条件的长度大于1,且仅使用第一个元素”_R_Stringr - Fatal编程技术网

R 使用if-else循环时出现错误“条件的长度大于1,且仅使用第一个元素”

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

我是一个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_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")))))