Niu*_*ang 1 string if-statement r
我正在根据另一个变量的字符串条件填充数据框的新变量.我收到以下错误消息:
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')
)))
我建议你将深层嵌套的ifelse语句分解为更易于管理的块.
但错误告诉你,你不能那样使用|. 'a' | 'b'因为它是一个逻辑比较,所以没有意义.而是使用%in%:
Source %in% c('htpWWW.BGDAILYNEWS.com', 'WWW.BGDAILYNEWS.COM')
Run Code Online (Sandbox Code Playgroud)
我想...如果我理解你在做什么,你会更好地使用多个作业:
County = vector(mode='character', length=length(Source))
County[County %in% c('htpWWW.BGDAILYNEWS.com', 'WWW.BGDAILYNEWS.COM')] <- 'Warren'
etc.
Run Code Online (Sandbox Code Playgroud)
您还可以switch对此类事物使用语句:
myfun <- function(x) {
switch(x,
'httpWWW.BGDAILYNEWS.COM'='Warren',
'httpWWW.HCLOCAL.COM'='Henry',
etc...)
}
Run Code Online (Sandbox Code Playgroud)
然后你想做一个简单的apply(sapply)传递每个元素Source到myfun:
County = sapply(Source, myfun)
Run Code Online (Sandbox Code Playgroud)
或者最后,你可以使用factors和levels,但我会将其作为练习留给读者......
一种不同的方法:
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)]
Run Code Online (Sandbox Code Playgroud)
这将返回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)])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10423 次 |
| 最近记录: |