lapply?和递归部分替换,数据帧

时间:2016-02-09 15:25:04

标签: r recursion multiple-columns lapply

我想简化模式匹配以更新数据帧。例如,需要将0添加到所有单个字符,字段2和2。 3:

onRowClicked(event: any) { console.log('row', event); }
onCellClicked(event: any) { console.log('cell', event); }
onSelectionChanged(event: any) { console.log("selection", event); }

此解决方案可以正常工作:

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) 

通过反复试验,上述内容的变化已经奏效,但后来我获得了不匹配的NA(所有值都以5结尾)。所以,我至少错过了几件如回收df&amp; amp;处理新来的人。

如果以上工作原理,那么我想通过以下方式循环使用多个字段:

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")}))} )  

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

我愿意......

mycols = 2:3
x[, mycols] <- lapply(x[, mycols], function(z) sub("^(.)$", "\\10", z))

给出了

     Site Upstream Downstream Value
1  Site A       A5         A0   120
2  Site A       B0         A5   168
3  Site A       B5         B0   190
4  Site A       C0         B5   127
5  Site A       C5         C0   110
6  Site B       A5         A0   167
7  Site B       B0         A5   150
8  Site B       B5         B0   175
9  Site B       C0         B5   188
10 Site B       C5         C0   196

这使用正则表达式来标识构成完整字符串的单个字符. - 从开始^到完成$。括号标识一个&#34;组&#34;在\\1的替换中引用。

答案 1 :(得分:2)

如果没有正则表达式,您可以使用:

mycols = 2:3
x[, mycols] <- apply(x[,mycols], 2, function(x) ifelse(nchar(x)<2, paste0(x,0), x))

如果字符串的长度小于2,该函数会在字符串后面粘贴0。如docendo discimus所述,您还可以使用nchar(x) == 1来搜索长度为1的字符串。