如何使用顺序方法编码多列

时间:2019-06-17 19:19:25

标签: r tidyverse

我有多列,我想按顺序对它们进行编码。这是这些列的示例:

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 个答案:

答案 0 :(得分:1)

您可以使用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

或者,借用d.b的累加/套用想法(如果您认为此方法更好,则应接受d.b的回答)

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

答案 1 :(得分:1)

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