【发布时间】:2016-02-09 15:25:03
【问题描述】:
我想简化模式匹配以更新数据帧。例如,需要将零添加到所有单个字符,字段 2 和 3:
set.seed(5)
x<-data.frame(Site=c(rep("Site A",5),rep("Site B",5)),
Upstream=rep(c("A5","B","B5","C","C5"),2),
Downstream=rep(c("A","A5","B","B5","C"),2),
Value=sample(100:200,10), stringsAsFactors=FALSE)
此解决方案效果很好,逐个字段:
r<-data.frame(V1=LETTERS[1:11],V2<-paste0(LETTERS[1:11],"0"), stringsAsFactors=FALSE)
replc<-r[,2][match(x[,3],r[,1])]
x[,3]<-ifelse(is.na(replc),x[,3],replc)
对于多个字段,这些基于列表的尝试会产生一些有趣的结果,但不是我想要的:
s2<-LETTERS[seq(1:11)]
lapply(s2,function(z){replace(x[,3],x[,3]==z,paste0(z,"0"))})
lapply(s2,function(z){x[,3][x[,3]==z]<-paste0(z,"0")})
lapply(s2,function(z){x[x[,3]==z,]<-paste0(z,"0");x} )
lapply(s2,function(z){within(x,x[,3][x[,3]==z]<-paste0(z,"0"))} )
lapply(s2,function(z){(with(x,{x[x[,3]==z,]<-paste0(z,"0")}))} )
通过反复试验,上述变化已经奏效,但随后我得到了不匹配的 NA(所有值都以 5 结尾)。所以,我至少错过了一些东西,比如回收 df 和处理 NA。
如果上述方法有效,那么我只想循环遍历许多字段,并按照以下方式进行替换:
lapply(x[,2;3], function(y){
lapply(s2,function(z){x[,y][a[,y]==z]<-paste0(z,"0")})
})
感谢您的帮助。
【问题讨论】:
-
或者,类似于Jimbou的建议:
x[] <- lapply(x, function(y) ifelse(nchar(y) == 1, paste0(y, 0), y)) -
我去掉了括号。对不起。是的,这些建议看起来应该可行。感谢您的帮助。
-
我缺少括号,抱歉。是的,这些建议看起来应该可行。感谢您的帮助。这个问题更普遍,但并非所有字符串都以 5 结尾。
标签: r recursion multiple-columns lapply