我想根据数字+ 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 }
})
Run Code Online (Sandbox Code Playgroud)
但我得到了输出:
if(grep(pattern ="W",y)== 1){:参数长度为零时出错
为什么?如果y匹配"W"则值为1,我的代码有什么问题?
您的查询可以通过以下示例进行说明:
grep(pattern="W","huh")
# integer(0)
Run Code Online (Sandbox Code Playgroud)
没有匹配导致长度为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
Run Code Online (Sandbox Code Playgroud)