我有此数据,其中每个单元格均由字符,
组成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"
在this之后,我可以这样写
testdata2 <- data.frame(lapply(testdata, function(x) {gsub("0", "000", x)}))
或者这个
testdata %>% mutate_all(funs(str_replace_all(., "0", "000")))
在两种情况下,它都用000替换 ALL 0。结果数据看起来像这样,
> testdata
x1 x2 x3
1 1000000 000 11000
2 000 000 000
3 12000 000 000
这不是我想要的。任何想法如何解决这个问题?
答案 0 :(得分: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"
答案 1 :(得分: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 :(得分: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
答案 3 :(得分:1)
我们可以将ifelse
中的strrep
与base R
一起使用
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"
在OP的帖子中,它用匹配所有“ 0”数字的gsub
或str_replace_all
替换“ 0”,而不仅仅是检查该值是否为0
答案 4 :(得分: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"
组成,并且仅由一个字符组成。