在data.frame R中一次替换多个数字

时间:2014-10-05 12:11:13

标签: r replace dataframe gsub

我的数据框看起来像这样:

   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')

提前致谢,

3 个答案:

答案 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中有qdapvectors会将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}}