我想根据数字+ W是数字* 2的规则来计算我的数据。
dat="1W 16 2W 16
1 16 2W 0
1W 16 16 0
4 64 64 0"
data=read.table(text=dat,header=F)
apply(data,c(1,2),function(y){
if(grep(pattern="W",y) ==1 )
{ gsub("W",paste("*",2,sep=""),y)->s;
eval(parse(text=s));
} else
{y <- y }
})
但是我得到了输出:
if(grep(pattern =“W”,y)== 1){:参数长度为零
时出错
为什么呢?如果y匹配“W”,则值为1,我的代码有什么问题?
答案 0 :(得分:6)
您的查询可以通过以下示例进行说明:
grep(pattern="W","huh")
# integer(0)
没有匹配导致长度为0的向量,因此出错。而是使用grepl
,即if( grepl( "W" , y ) )
。
grepl
的返回值为TRUE
或FALSE
。
作为旁注,eval( parse( "sometext" ) )
被认为不是一个好主意。您可以尝试使用以下不整洁的lapply
语句(这将比apply
更好,因为您不必先转换为矩阵):
data.frame( lapply( data , function(x)
ifelse( grepl("W",x) ,
as.integer( gsub("W","",x) ) * 2L ,
x ) ) )
# V1 V2 V3 V4
#1 2 16 4 16
#2 1 16 4 0
#3 2 16 1 0
#4 3 64 3 0
答案 1 :(得分:0)
这是一种相当奇怪的方法,它可以正常工作:
library(sfsmisc)
foo<- c('2','23', 'W4','W53','17')
bar<-sapply(foo, function(x)AsciiToInt(x))
barw<-sapply(bar,function(x)x[x!=87])
bard<-logical(length(foo))
for (i in 1:length(foo) ) bard[i]<-length(barw[[i]])== length(bar[[i]])
foow<-vector()
for(i in 1:length(foo)) foow[i]<-as.numeric(paste0(chars8bit(barw[[i]]),collapse='') ) *(1+!bard[i])
答案 2 :(得分:0)
如果您将一个空向量传递到 if 语句中,例如:
myvariable = c()
if (myvariable){
print("hello")
}
你会得到一个错误:
Error in if (myvariable) { : argument is of length zero
空的 R 向量可以通过 grep 等函数冒出数据类型错误,例如:
if (grepl("foo", c(), fixed = TRUE)){
print("yes")
}
哪个失败了:
Error in if (grepl("foo", c(), fixed = TRUE)) { :
argument is of length zero
因此,补救措施是在将变量作为参数提供给 if 语句或 grep 等函数之前,对变量进行更多类型检查。