R: объединить информационный блок уровней факторной переменной в одну переменную - PullRequest
0 голосов
/ 02 мая 2020

Предположим, у меня есть некоторые данные, такие как:

shap_long2_seq_smpl %>% filter(rfvalue == 1)
    variable        value rfvalue stdfvalue mean_value
1       seq2 -0.006656496       1         1 0.01644774
2       seq3 -0.042137858       1         1 0.01698607
3       seq4  0.013982538       1         1 0.02148417
4       seq4  0.010608653       1         1 0.02148417
5       seq4  0.048446395       1         1 0.02148417
6       seq4  0.018380914       1         1 0.02148417
7       seq2 -0.003593612       1         1 0.01644774
8       seq1 -0.007202307       1         1 0.02364745
9       seq4  0.008393394       1         1 0.02148417
10      seq2 -0.020584987       1         1 0.01644774

Как бы получить что-то вроде:

        variable        value rfvalue stdfvalue mean_value
    1       seq -0.006656496       2         1 0.01644774
    2       seq -0.042137858       3         1 0.01698607
    3       seq  0.013982538       4         1 0.02148417
    4       seq  0.010608653       4         1 0.02148417
    5       seq  0.048446395       4         1 0.02148417
    6       seq  0.018380914       4         1 0.02148417
    7       seq -0.003593612       2         1 0.01644774
    8       seq -0.007202307       1         1 0.02364745
    9       seq  0.008393394       4         1 0.02148417
    10      seq -0.020584987       2         1 0.01644774

Обратите внимание, что shap_long2_seq_smpl:

> str(shap_long2_seq_smpl)
Classes ‘data.table’ and 'data.frame':  1345785 obs. of  5 variables:
 $ variable  : Factor w/ 12 levels "seq1","seq2",..: 2 8 8 8 11 8 1 3 8 7 ...

(первые два фрагмента кода являются просто примерами)

Ответы [ 2 ]

0 голосов
/ 03 мая 2020

Мы можем использовать sub для извлечения соответствующих частей данных. Так как у вас есть data.table с использованием синтаксиса data.table.

library(data.table)

shap_long2_seq_smpl[,c("rfvalue", "variable"):= list(sub('[a-z]+', '', variable),
                                                     sub('\\d+', '', variable))]

shap_long2_seq_smpl

#    variable        value rfvalue stdfvalue mean_value
# 1:      seq -0.006656496       2         1 0.01644774
# 2:      seq -0.042137858       3         1 0.01698607
# 3:      seq  0.013982538       4         1 0.02148417
# 4:      seq  0.010608653       4         1 0.02148417
# 5:      seq  0.048446395       4         1 0.02148417
# 6:      seq  0.018380914       4         1 0.02148417
# 7:      seq -0.003593612       2         1 0.01644774
# 8:      seq -0.007202307       1         1 0.02364745
# 9:      seq  0.008393394       4         1 0.02148417
#10:      seq -0.020584987       2         1 0.01644774
0 голосов
/ 02 мая 2020

Мы можем использовать parse_number из readr

library(readr)
library(dplyr)
shap_long2_seq_smpl %>%
   mutate(rfvalue  = parse_number(variable), 
          variable = str_remove(variable, "\\d+$"))

Или, если это всегда 'seq', тогда использовать substring

shap_long2_seq_smpl %>%
       mutate(rfvalue = substring(variable, 4),
              variable = substring(variable, 1, 3))

Или с separate

library(tidyr)
shap_long2_seq_smpl %>%
        separate(variable, into = c('variable', 'rfvalue'),
          sep = "(?<=[A-Za-z])(?=[0-9])", convert  = TRUE)

Или с tstrsplit в data.table

library(data.table)
shap_long2_seq_smpl[, variable := as.character(variable)
     ][, c('variable', 'rfvalue') := tstrsplit(variable,  
           "(?<=[A-Za-z])(?=[0-9])")]

В base R, мы можем использовать strsplit

shap_long2_seq_smpl[c('variable', 'rfvalue')] <- do.call(rbind,
      strsplit(as.character(shap_long2_seq_smpl), 
                    "(?<=[A-Za-z])(?=[0-9])", perl = TRUE))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...