在数据框中将所有变量中的特定字符替换。

4
我有一份数据,其中每个单元格都由字符组成。
x1 <- c(100, 0, 120)
x2 <- c(0, 0, 0)
x3 <- c(110, 0, 0)
data<- data.frame(x1, x2, x3)
testdata <- lapply(data, as.character)
testdata
$`x1`
[1] "100" "0"   "120"
$x2
[1] "0" "0" "0"
$x3
[1] "110" "0"   "0" 

我希望将只包含0的字符串条目替换为000。这意味着我的数据应该如下所示:
> str(testdata)
    List of 3
     $ x1: chr [1:3] "100" "000" "120"
     $ x2: chr [1:3] "000" "000" "000"
     $ x3: chr [1:3] "110" "000" "000"

参考这个,我可以写成如下代码:

testdata2 <- data.frame(lapply(testdata, function(x) {gsub("0", "000", x)}))

或者是这样的:

testdata %>% mutate_all(funs(str_replace_all(., "0", "000")))

在这两种情况下,它都将所有的0替换为000。最终的数据看起来像这样,
> testdata
       x1  x2    x3
1 1000000 000 11000
2     000 000   000
3   12000 000   000

这不是我想要的。有什么办法解决这个问题吗?
5个回答

3

您也可以使用sprintf,即:

lapply(testdata, function(i)sprintf('%03d', as.numeric(i)))
#$`x1`
#[1] "100" "000" "120"

#$x2
#[1] "000" "000" "000"

#$x3
#[1] "110" "000" "000"

2

或者:

library(tidyverse)

testdata %>%
  map_df(~if_else(.x == "0", "000", .x))

# A tibble: 3 x 3
#x1    x2    x3   
#<chr> <chr> <chr>
#  1 100   000   110  
#2 000   000   000  
#3 120   000   000  

2
x1 <- c(100, 0, 120)
x2 <- c(0, 0, 0)
x3 <- c(110, 0, 0)
data<- data.frame(x1, x2, x3)
testdata <- lapply(data, as.character)

如果您的数据可以保留在data.frame格式中,那么以下方法可以实现:
testdata <- as.data.frame(testdata, stringsAsFactors = F)

testdata[testdata == '0'] <- '000'

   x1  x2  x3
1 100 000 110
2 000 000 000
3 120 000 000

它完美地运行了。我应该将问题呈现为数据框。谢谢。 - small_lebowski

1
我们可以在基本 R 中使用带有 `strrep` 的 `ifelse`。
lapply(testdata, function(x) ifelse(x == 0, strrep(x, 3), x))
#$x1
#[1] "100" "000" "120"

#$x2
#[1] "000" "000" "000"

#$x3
#[1] "110" "000" "000"

在发帖者的帖子中,它使用 gsubstr_replace_all 替换所有的 "0" 数字,而不仅仅是检查该值是否为 0。

1
在基本的R中,有一个带有适当正则表达式的sub函数。
lapply(testdata, function(x) sub("^0$", "000", x))
#$x1
#[1] "100" "000" "120"
#
#$x2
#[1] "000" "000" "000"
#
#$x3
#[1] "110" "000" "000"

解释:符号“^”标记字符串的开头,“$”标记字符串的结尾。因此,模式“^0$”由字符“0”组成,仅由该字符组成。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接