我想简化模式匹配以更新数据帧。例如,需要将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")}))} )
感谢您的帮助。
答案 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的字符串。