我想根据数字+ 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,我的代码有什么问题?
您的查询可以通过以下示例进行说明:
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