我有多列,我想按顺序对它们进行编码。这是这些列的示例:
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)
有没有更好,更可靠的解决方案来获取我的桌子?
答案 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