嵌套的IF语句在R中创建新列

问题描述

我是R的新手,正在尝试学习。这是我正在使用的简化的df。假设这是大约90个地点,全部使用城市缩写

df$Location <- c("SEA","DEN","CHI","NYC")

我正在尝试使用此公式添加一个名为TimeZone的列

if(df$Location==c('SEA')){
  df$TimeZone <- "PST"
} else {
  if(df$Facility==c('DEN')){
  df$TimeZone <- "MST"
} else {
  if(df$Location==c('CHI')){
  df$TimeZone <- "CST"
} else {
 if(df$Location==c('NYC')){
  df$Location <- "EST"
  }
  }
  }  
}

我收到此错误:

较长的对象长度不是较短的对象长度的倍数条件具有长度> 1,并且仅将使用第一个元素较长的对象长度不是较短的对象长度的整数倍,条件具有长度> 1,并且将仅使用第一个元素较长对象长度不是较短对象长度的倍数,条件的长度> 1,并且仅使用第一个元素

解决方法

我们可以使用嵌套的ifelsecase_when来做到这一点,与if/else相比,它们是矢量化的(标量-长度为1)

library(dplyr)
df <- df %>%
     mutate(TimeZone = case_when(Location == 'SEA' ~ 'PST',Location == 'DEN' ~ 'MST',Location == 'CHI' ~ 'CST',Location == 'NYC' ~ 'EST'))

如果元素很多,请创建键/值数据集并进行联接

keyval <- data.frame(Location = c('SEA','DEN','CHI','NYC'),TimeZone = c('PST','MST','CST','EST'))
left_join(df,keyval)
,

以下是一些基本的R选项:


  • 使用Vectorize + switch
f <- Vectorize(function(x) {
  switch(x,"SEA" = "PST","DEN" = "MST","CHI" = "CST","NYC" = "EST"
  )
})

然后像下面一样使用f

df$timezone <- f(df$location)

  • 使用match
df$timezone <- c("PST","MST","CST","EST")[match(df$location,c("SEA","DEN","CHI","NYC"))]
,

在您刚接触R时,很高兴知道您必须使用以下代码创建数据框:

#Data
df <- data.frame(Location=c("SEA","NYC"),stringsAsFactors = F)

有条件时,可以使用向量保存结果,然后分配值:

#Create conditions
c1 <- df$Location=='SEA'
c2 <- df$Location=='DEN'
c3 <- df$Location=='CHI'
c4 <- df$Location=='NYC'

之后,您可以先分配所需的值,然后创建一个空变量:

#First create an empty var
df$TimeZone <- NA
#Replace
df$TimeZone[c1]<-'PST'
df$TimeZone[c2]<-'MST'
df$TimeZone[c3]<-'CST'
df$TimeZone[c4]<-'EST'

输出:

  Location TimeZone
1      SEA      PST
2      DEN      MST
3      CHI      CST
4      NYC      EST

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...