2013-07-25 122 views
1

我正在根据另一个变量的字符串条件填充数据框的新变量。我收到以下错误信息:R:字符串上的ifelse

Error in Source == "httpWWW.BGDAILYNEWS.COM" | Source == : operations are possible only for numeric, logical or complex types

我的代码如下:

County <- ifelse(Source == 'httpWWW.BGDAILYNEWS.COM' | 'WWW.BGDAILYNEWS.COM', 'Warren', ifelse(Source == 'httpWWW.HCLOCAL.COM' | 'WWW.HCLOCAL.COM', 'Henry', ifelse(Source == 'httpWWW.KENTUCKY.COM' | 'WWW.KENTUCKY.COM', 'Fayette', ifelse(Source == 'httpWWW.KENTUCKYNEWERA.COM' | 'WWW.KENTUCKYNEWERA.COM', 'Christian') )))

+2

你需要作出后,每'比较|'。例如,'ifelse(Source =='foo1'| Source =='foo2',return1,return2)''而不是'ifelse(Source =='foo1'|'foo2',return1,return2)' – ialm

+0

是的,你对了,我错过了一些比较条件,这就是代码失败的原因。不过,我应该尝试一种更清洁的技术... – NiuBiBang

回答

6

我建议你打破的是深嵌套ifelse语句转换成更易于管理的块。

但错误是告诉你,你不能使用这样的|'a' | 'b'没有意义,因为它是一个逻辑比较。而是使用%in%

Source %in% c('htpWWW.BGDAILYNEWS.com', 'WWW.BGDAILYNEWS.COM') 

我想......如果我理解你在做什么,你会好得多使用多个任务:

County = vector(mode='character', length=length(Source)) 
County[County %in% c('htpWWW.BGDAILYNEWS.com', 'WWW.BGDAILYNEWS.COM')] <- 'Warren' 
etc. 

你也可以使用一个switch声明这种类型的事情:

myfun <- function(x) { 
    switch(x, 
     'httpWWW.BGDAILYNEWS.COM'='Warren', 
     'httpWWW.HCLOCAL.COM'='Henry', 
     etc...) 
} 

然后你想要做一个简单的应用(sapply)传递每个元素Sourcemyfun

County = sapply(Source, myfun) 

或者最后,你可以使用factorslevels,但我会离开,作为一个练习留给读者......

+0

“switch”。如果你发现自己使用2个以上'ifelse',你应该使用'switch'或'cut'。 –

+0

@Justin,很抱歉问,但你可以发布一个更具体的例子'switch'函数吗?具体而言,如何使用'switch'从'Source'变量创建'County'变量?大家一致认为,我的'ifelse'不是简单的。 – NiuBiBang

+0

@DaNiu看到我的编辑。 – Justin

5

一种不同的方法:

county <- c("Warren","Henry","Fayette","Christian") 
sites <- c("WWW.BGDAILYNEWS.COM","WWW.HCLOCAL.COM","WWW.KENTUCKY.COM","WWW.KENTUCKYNEWERA.COM") 
County <- county[match(gsub("^http","",Source), sites)] 

这将返回NA作为与任何给定输入不匹配的字符串。

使用哈德利的建议(lookup-tables-character-subsetting):

lookup <- c(WWW.BGDAILYNEWS.COM="Warren", WWW.HCLOCAL.COM="Henry", WWW.KENTUCKY.COM="Fayette", WWW.KENTUCKYNEWERA.COM="Christian") 
County <- unname(lookup[gsub("^http","",Source)]) 
+0

你也可以直接消除'match'并使用字符子集:https://github.com/hadley/devtools/wiki/Subsetting#lookup-tables-character-subsetting – hadley