2

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

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') )))

4

2 回答 2

7

我建议你把这个嵌套很深的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...)
}

然后你想做一个简单的 apply( sapply) 将每个元素传递Sourcemyfun

County = sapply(Source, myfun)

或者最后,您可以使用factorsand levels,但我将把它作为练习留给读者......

于 2013-07-25T18:50:12.913 回答
6

另一种方法:

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与任何给定输入都不匹配的字符串。

使用 Hadley 的建议(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)])
于 2013-07-25T18:51:49.327 回答