R преобразование целочисленного столбца в 3 факторных столбца на основе цифр - PullRequest
4 голосов
/ 09 января 2012

У меня есть столбец типа int вот так:

idNums
   2
 101
  34
  25
   8
 ...

Мне нужно преобразовать их в 3 факторных столбца, например:

digit1        digit2         digit3
  0             0              2
  1             0              1
  0             3              4
  0             2              5
  0             0              8
 ...           ...            ...

Есть предложения?

Ответы [ 3 ]

7 голосов
/ 09 января 2012

Вот забавное решение с использованием модульных арифметических операторов %% и %/%:

d <- c(2, 101, 34, 25, 8)
res <- data.frame(digit1 = d %/% 100, 
                  digit2 = d %% 100 %/% 10,  
                  digit3 = d %% 10)
#   digit1 digit2 digit3
# 1      0      0      2
# 2      1      0      1
# 3      0      3      4
# 4      0      2      5
# 5      0      0      8

Обратите внимание, что он имеет незначительное, но приятное побочное преимущество - возвращает числовые значения для каждого из столбцов. Однако если вы хотите вместо этого фактор столбцов, просто выполните следующую команду:

res[] <- lapply(res, as.factor)

all(sapply(res, class)=="factor")
#[1] TRUE
5 голосов
/ 09 января 2012

Используйте formatC и strsplit.

idNums <- c(2, 101, 34, 25, 8)
idChars <- formatC(idNums, width = 3, flag = "0")
idChars <- strsplit(idChars, "")
data.frame(
  digits1 = sapply(idChars, function(x) x[1]),  
  digits2 = sapply(idChars, function(x) x[2]),
  digits3 = sapply(idChars, function(x) x[3])  
)

Это немного чище, используя пакет stringr. Заменить вызов на strsplit на

str_split_fixed(idChars, "", 3)
3 голосов
/ 09 января 2012

Я думал, что Ричи Коттонс использует formatC, и я включил его:

testdat <- read.fwf(textConnection(formatC(idNums, width = 3, flag = "0")  ), 
                    widths=c(1,1,1), 
                    col.names=c("digit1", "digit2", "digit3")
                    )
testdat
#------------
  digit1 digit2 digit3
1      0      0      2
2      1      0      1
3      0      3      4
4      0      2      5
5      0      0      8
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...