Как кодировать несколько столбцов в последовательном подходе - PullRequest
1 голос
/ 17 июня 2019

У меня есть несколько столбцов, и я хочу кодировать их последовательно. Вот образец столбцов:

df<-read.table(text=" A M Z X

124321  33333   123 1309
234543  12121   33  1308
130991  200EE   123 1308
130911  200EE   123 1309
124321  12121   33  1309
234543  33333   232 1309", h=T)

Я хочу получить эту таблицу:

df1<-read.table(text=" Group1   Group2  Group3  Group4

1   6   9   12
4   5   8   11
3   7   9   11
2   7   9   12
1   5   8   12
4   6   10  12
", h=T)

Я использовал следующие базовые коды, но они ненадежны, особенно когда столбцы увеличены на основе моего опыта.

  df$Group1 <- as.integer(as.factor(df$A))
  df$Group2 <- as.integer(as.factor(df$M)) + max(df$Group1)
  df$Group3 <- as.integer(as.factor(df$Z)) + max(df$Group2)
  df$Group4 <- as.integer(as.factor(df$X)) + max(df$Group3)

Есть ли лучшее и более надежное решение для получения моего стола?

Ответы [ 2 ]

1 голос
/ 17 июня 2019
df2 = lapply(df, function(x) as.integer(as.factor(x)))
data.frame(Map("+", df2, cumsum(c(0, head(sapply(df2, max), -1)))))
#  A M  Z  X
#1 1 7  9 12
#2 4 5  8 11
#3 3 6  9 11
#4 2 6  9 12
#5 1 5  8 12
#6 4 7 10 12
1 голос
/ 17 июня 2019

Вы можете использовать accumulate

library(tidyverse)

df %>% 
  mutate_all(~ as.integer(as.factor(.))) %>% 
  accumulate(~ .y + max(.x)) %>% 
  bind_cols %>% 
  rename_all(~ paste0('Group', seq_along(.)))

# # A tibble: 6 x 4
#   Group1 Group2 Group3 Group4
#    <int>  <int>  <int>  <int>
# 1      1      7      9     12
# 2      4      5      8     11
# 3      3      6      9     11
# 4      2      6      9     12
# 5      1      5      8     12
# 6      4      7     10     12

Второй столбец отличается от того, который вы показываете, но на основании приведенного ниже вывода он выглядит так, как будто он работает, как ожидалось

df %>% 
  mutate_all(~ as.integer(as.factor(.)))
#   A M Z X
# 1 1 3 2 2
# 2 4 1 1 1
# 3 3 2 2 1
# 4 2 2 2 2
# 5 1 1 1 2
# 6 4 3 3 2

Или, заимствуя идею dum cumsum / sapply (следует принять ответ db, если вы считаете, что этот метод лучше)

df %>% 
  mutate_all(~ as.integer(as.factor(.))) %>% 
  map2_dfc(c(0, cumsum(sapply(., max))[-ncol(.)]), `+`)
# # A tibble: 6 x 4
#       A     M     Z     X
#   <dbl> <dbl> <dbl> <dbl>
# 1     1     7     9    12
# 2     4     5     8    11
# 3     3     6     9    11
# 4     2     6     9    12
# 5     1     5     8    12
# 6     4     7    10    12
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...