Кодирование данных и изменение имен столбцов в других столбцах с использованием кодов в R и Tidyverse - PullRequest
1 голос
/ 17 февраля 2020

ниже, я продемонстрировал часть своих данных:

df<-read.table(text=" K G   M
12  2345    Gholi
KAM 2345    KAM
Noghl   1990    KAM
Zae 1990    441
12  2345    441
KAM 1990    12
Noghl   1800    12"

,header=TRUE)

Я хотел бы сделать коды для K, G и M и начиная с 1. У нас есть 4 группы в K, поэтому 1,2 , 3 и 4. для G, начните с 5, поэтому 5, 6 и 7, поскольку у нас есть три подгруппы.

Используя следующие коды, я получу следующую таблицу:

df = lapply(df, function(x) as.integer(as.factor(x)))
data.frame(Map("+", df, cumsum(c(0, head(sapply(df, max), -1)))))

Я получу следующую таблицу:

KM  KN  KZ
1   7   10
2   7   11
3   6   11
4   6   9
1   7   9
2   6   8
3   5   8

Теперь я хочу получить следующую таблицу:

Group	C
K,M	1,8
K,M	2,11
K	3
K	4
G	7
G	6
M	10
M	9

Например, в группе столбец K (12), M (12,12) переходит к кодам 1 и 8, так как они закодированы в KM и KZ и т. Д.

1 Ответ

0 голосов
/ 17 февраля 2020

После преобразования всех столбцов в целочисленные значения на основе маршрута factor и добавления значения max предыдущих столбцов к текущему, мы pivot переходим в «длинный» формат с pivot_longer, связываем с оригиналом значения столбцов преобразуются в формат «long», сгруппированные по столбцу исходного значения «origval», paste unique элементы других столбцов

library(dplyr)
library(tidyr)
df %>%
      mutate_all(~ as.integer(factor(.))) %>% 
      mutate(G = max(K) + G, M = max(G) + M) %>% 
      pivot_longer(everything()) %>% 
      bind_cols(df %>% 
                  mutate_all(as.character) %>% 
                  pivot_longer(everything(),values_to = 'origvalue') %>%
                  dplyr::select(-name)) %>% 
     group_by(origvalue) %>%
     summarise_at(vars(-group_cols()), ~toString(unique(.))) %>%
     dplyr::select(Group = name, C = value)
# A tibble: 9 x 2
#   Group C    
#  <chr> <chr>
#1 K, M  1, 8 
#2 G     5    
#3 G     6    
#4 G     7    
#5 M     9    
#6 M     10   
#7 K, M  2, 11
#8 K     3    
#9 K     4    

data

df <- structure(list(K = structure(c(1L, 2L, 3L, 4L, 1L, 2L, 3L), .Label = c("12", 
"KAM", "Noghl", "Zae"), class = "factor"), G = c(2345L, 2345L, 
1990L, 1990L, 2345L, 1990L, 1800L), M = structure(c(3L, 4L, 4L, 
2L, 2L, 1L, 1L), .Label = c("12", "441", "Gholi", "KAM"), 
class = "factor")), class = "data.frame", row.names = c(NA, 
-7L))
...