我正在尝试根据相邻列的值在新列中指定名称。 我正在使用一个采用模式并将其替换为另一个模式的函数:
sub<-function(pattern, replacement, x, ...) {
result <- x
for (i in 1:length(pattern)) {
result <- gsub(pattern[i], replacement[i], result, ...)
}
result
}
我可以采取以下措施:
df$x<-as.character(df$x)
df$y<-(sub(c("1A1","1B2", "1.00E+01"),
c("P1", "P2", "P3"), df$x))
所以,df $ y现在将包含P1,P2,其中1A1,1B2存在于df $ x中。然而,&#34; 1.00E + 02&#34;不会在df $ y中给出P3,而是复制1.00E + 02。
我是否遗漏了有关指数以及如何将其视为模式的内容?
以下是我的数据表示例,其中df $ x是ID,df $ y是名称:
Name ID
p1 1A1
p2 1B2
1.00E+01 1.00E+01
任何帮助将不胜感激。 谢谢MF
答案 0 :(得分:1)
默认情况下,pattern
被解析为正则表达式,.
和+
在正则表达式中具有特殊含义。使用fixed = TRUE
:
mysub<-function(pattern, replacement, x, ...) {
result <- x
for (i in 1:length(pattern)) {
result <- gsub(pattern[i], replacement[i], result, fixed = TRUE, ...)
}
result
}
x <- c("1A1", "1B2", "1.00E+01")
mysub(c("1A1","1B2", "1.00E+01"),
c("P1", "P2", "P3"), x)
#[1] "P1" "P2" "P3"
我更喜欢使用factor
:
as.character(factor(x,
levels = c("1A1","1B2", "1.00E+01"),
labels = c("P1", "P2", "P3")))
#[1] "P1" "P2" "P3"
答案 1 :(得分:0)
@Roland,是的,它绝对是+符号,它搞砸了1.00E + 0X值。如果有任何兴趣,我会找到以下解决方法。
mysub2 <-function(pattern, replacement, x, ...) {
result <- rep("", length(x))
for (i in 1:length(pattern)){
result[x==pattern[i]]<-replacement[i]
}
result
}