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

嵌套IF语句以在R中创建新列,r,if-statement,nested,cluster-analysis,analytics,R,If Statement,Nested,Cluster Analysis,Analytics,我是R的新手,正在努力学习。这是我正在使用的一个大大减少的df。假设这是大约90个使用城市缩写的地点 df$Location <- c("SEA", "DEN", "CHI", "NYC") 我试图用这个公式添加一个名为TimeZone的列 if(df$Location==c('SEA')){ df$TimeZone <- "PST" } else { if(df$Facil

我是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且仅使用第一个元素


我们可以使用嵌套的ifelse或case_来实现这一点,当与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)

我们可以使用嵌套的ifelse或case_来实现这一点,当与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选项:

使用矢量化+开关 使用匹配
以下是一些基本的R选项:

使用矢量化+开关 使用匹配 由于您是R新手,因此很高兴知道您必须使用以下代码创建数据帧:

#Data
df <- data.frame(Location=c("SEA", "DEN", "CHI", "NYC"),stringsAsFactors = F)
由于您是R新手,因此很高兴知道您必须使用以下代码创建数据帧:

#Data
df <- data.frame(Location=c("SEA", "DEN", "CHI", "NYC"),stringsAsFactors = F)
你需要ifelse而不是if/else你需要ifelse而不是if/else
#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