Заменить определенный символ во всех переменных в фрейме данных - PullRequest
0 голосов
/ 15 января 2019

У меня есть эти данные, где каждая ячейка состоит из символов ,

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

В обоих случаях он заменяет ALL 0s на 000. И результирующие данные выглядят так:

> testdata
       x1  x2    x3
1 1000000 000 11000
2     000 000   000
3   12000 000   000

это не то, что я ищу. Есть идеи, как решить эту проблему?

Ответы [ 5 ]

0 голосов
/ 15 января 2019

Вы также можете использовать 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"
0 голосов
/ 15 января 2019
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
0 голосов
/ 15 января 2019

Или:

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  
0 голосов
/ 15 января 2019

В базе 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" и только этого одного символа.

0 голосов
/ 15 января 2019

Мы можем использовать 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"

В посте ОП он заменяет «0» на gsub или str_replace_all, что соответствует всей цифре «0», вместо того, чтобы просто проверять, равно ли значение 0 или нет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...