我的数据框看起来像这样:
C1 C2
0 1
2 -1
1 1
-1 2
0 0
我希望将所有-1替换为'减去' ,0到' nc' ,1到'加1' ,2到' plus2'。 我知道如何使用' gsub'逐个替换这些数字。但我不知道如何一次更换它们。 作为0和-1的示例,这是我的代码:
gsub(df, '0', 'nc');gsub(df, '-1', 'minus')
提前致谢,
答案 0 :(得分:3)
这样的事可能吗?在这里,我基本上创造了一个传奇"一次然后在整个数据框上使用match
以替换所有列中的值
temp <- data.frame(A = (-1:2), B = c('minus', 'nc', 'plus1', 'plus2'))
df[] <- lapply(df, function(x) temp[match(x, temp$A), "B"])
df
# C1 C2
# 1 nc plus1
# 2 plus2 minus
# 3 plus1 plus1
# 4 minus plus2
# 5 nc nc
答案 1 :(得分:1)
此处无需使用正则表达式。矩阵子设置和替换在这里的简单循环中。请注意,对于替换,通常使用for循环比使用xxxpply族函数更好。
from <- -1:2
to <- c('minus', 'nc', 'plus1', 'plus2')
for (i in seq_along(from))df[df==from[i]] <- to[i]
C1 C2
1 nc plus1
2 plus2 minus
3 plus1 plus1
4 minus plus2
5 nc nc
答案 2 :(得分:1)
如果除了指定用于转换的值之外没有任何其他值,这也可以
lvls <- c('minus', 'nc', 'plus1', 'plus2') #create a vector for specifying the levels of factor.
将每列转换为factor
,并将labels
指定为lvls
,如果需要character
列,则将其重新转换为字符
df[] <- lapply(df, function(x) as.character(factor(x, labels=lvls)))
df
# C1 C2
#1 nc plus1
#2 plus2 minus
#3 plus1 plus1
#4 minus plus2
#5 nc nc
此外,如果您想要一个gsub
选项,mgsub
中有qdap
,vectors
会将library(qdap)
pat <- -1:2
replacer <- c('minus', 'nc', 'plus1', 'plus2')
v1 <- mgsub(pat, replacer, as.matrix(df)) #on the original dataset
dim(v1) <- dim(df)
df[] <- v1
df
# C1 C2
#1 nc plus1
#2 plus2 minus
#3 plus1 plus1
#4 minus plus2
#5 nc nc
作为搜索字词和替换。
df <- structure(list(C1 = c(0L, 2L, 1L, -1L, 0L), C2 = c(1L, -1L, 1L,
2L, 0L)), .Names = c("C1", "C2"), class = "data.frame", row.names = c(NA,
-5L))
{{1}}