我在R中相当新,对R中的if()语句有疑问。非常感谢任何帮助。 我的数据如下所示
Var1 var2
01 A
02 D
03 E
04 K
我需要根据var1创建2个附加变量(Var3和Var4)。在SAS中,我将以下列方式创建var3和var4:
if var1 = 01 then do; var3 = "New York"; var4= "NYC"; end; else;
if var1 = 02 then do; var3 = "Illinois"; var4= "ORD"; end; else;
if var1 = 03 then do; var3 = "Texas"; var4= "DFW"; end; else;
if var1 = 04 then do; var3 = "New Jersey"; var4= "EWR"; end; else;
我想将上面的if语句转换为R程序。任何帮助是极大的赞赏。
答案 0 :(得分:5)
var3 <- c("New York", "Illinois", "Texas", "New Jersey")[
match(var1, c("01","02","03","04")]
var4 <- c("NYC", "ORD", "DFW", "EWR")[
match(var1, c("01","02","03","04")]
通常,您将使用的项目是数据框架,而不是SAS-world中的集合。所以你会有一个数据对象名称,比如dat
,你可以执行:
dat$var4 <- with( dat, c("NYC", "ORD", "DFW", "EWR")[
match(var1, c("01","02","03","04")] )
答案 1 :(得分:2)
我对自己施加的基本R规则是存储您可能必须在适当的结构中调用的数据(例如 - vector
s用于一系列值,list
s用于相关系列不等长度的值,data.frame
s用于相关的等长系列等等。)
因此,在这种情况下,适当的结构是相同长度的相关系列的data.frame。 E.g:
srcs <- data.frame(
Var1=c("01","02","03","04"),
state=c("New York", "Illinois", "Texas", "New Jersey"),
code=c("NYC", "ORD", "DFW", "EWR")
)
然后使用该基本信息存储来适当添加新变量,例如:
dat <- cbind(dat, srcs[c("state","code")][match(dat$Var1,srcs$Var1),] )
# Var1 var2 state code
#1 01 A New York NYC
#2 02 D Illinois ORD
#3 03 E Texas DFW
#4 04 K New Jersey EWR
这会将一大堆if
/ else
语句转换为单个调用,并且无需进行丑陋的循环操作。
答案 2 :(得分:0)
另一个解决方案是使用ifelse
(假设var1
只有四个值)。
mydata$var3<- with (mydata, ifelse(var1 =="01", "New York" ,
ifelse (var1 == "02", "Illinois",
ifelse (var1 == "03","Texas" ,"New Jersey" ))))
mydata$var4<-with (mydata, ifelse (var1 =="01", "NYC",
ifelse (var1 == "02","ORD",
ifelse (var1 == "03", "DFW","EWR"))))