问题描述
我是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_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