Разбить переменные столбца на новые столбцы в сочетании с исходным именем столбца - PullRequest
0 голосов
/ 29 мая 2018

У меня есть фрейм данных с несколькими записями в нескольких ячейках.Существует три вида столбцов: те, которые содержат только 1/0, те, которые содержат 1/0 и некоторые другие записи, и те, которые не содержат 1/0.

Я хочу, чтобы все столбцы, содержащие другое значение (обычно две или более записей), были разбиты на x новых столбцов с именем столбца + значение в ячейке для каждого уникального значения встолбец, и 1/0, как это или нет.Все столбцы с только 1/0 останутся без изменений.

Примечание: Мой исходный фрейм данных больше и содержит много столбцов.Кроме того, содержимое в ячейках может варьироваться в зависимости от фрейма данных, и я хотел бы, чтобы он работал независимо от того, сколько / сколько записей в ячейках.Также обратите внимание, что у меня есть столбцы, которые я не хочу разбивать, либо потому, что они содержат только 1/0 (например, emrY), либо потому, что они содержат другие данные (например, T_CIP).

Фрейм данных:

structure(list(id = 1:10, emrA = c("I219V, T286A", "I219V", "I219V", 
"I219V", "I219V", "R164H, I219V", "R164H, I219V", "R164H, I219V", 
"R164H, I219V", "R164H, I219V"), gyrA_8 = c("S83L,678E", "D87N", 
"S83L,252G", "S83L,678E", "S83L,678E", "S83L,828T", "S83L,828T", 
"S83L,828T", "S83L,828T", "S83L,828T"), emrY = c("0", "1", "1", 
"1", "1", "1", "1", "1", "1", "1"), T_CIP = c(0.25, 0.12, 0.12, 
0.25, 0.25, 0.5, 2, 1, 1, 2)), .Names = c("id", "emrA", "gyrA_8", 
"emrY", "T_CIP"), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, 
-10L))

Как это выглядит:

     id emrA         gyrA_8    emrY  T_CIP
      1 I219V, T286A S83L,678E 0     0.25
      2 I219V        D87N      1     0.12
      3 I219V        S83L,252G 1     0.12
      4 I219V        S83L,678E 1     0.25
      5 I219V        S83L,678E 1     0.25
      6 R164H, I219V S83L,828T 1     0.5
      7 R164H, I219V S83L,828T 1     2
      8 R164H, I219V S83L,828T 1     1
      9 R164H, I219V S83L,828T 1     1
     10 R164H, I219V S83L,828T 1     2

Что я хочу получить в итоге:

id   emrA_I219V    emrA_T286A   emrA_R164H   gyrA_8_S83L   gyrA_8_678E   gyrA_8_D87N   gyrA_8_252G   gyrA_8_828T   emrY   T_CIP
 1   1             1            0            1             1             0             0             0             0      0.25
 2   1             0            0            0             0             1             0             0             1      0.12
 3   1             0            0            1             0             0             1             0             1      0.12
 4   1             0            0            1             1             0             0             0             1      0.25
 5   1             0            0            1             1             0             0             0             1      0.25
 6   1             0            1            1             0             0             0             1             1      0.5
 7   1             0            1            1             0             0             0             1             1      2
 8   1             0            1            1             0             0             0             1             1      1
 9   1             0            1            1             0             0             0             1             1      1
10   1             0            1            1             0             0             0             1             1      2

Столбец emrY былне разделен, потому что он содержит только 1/0.T_CIP (и другие подобные ему столбцы) не был разделен, поскольку он содержит другие данные.

Есть ли способ сделать это с помощью пакетов tidyverse?

РЕДАКТИРОВАТЬ:

Я не чувствую, что вопрос, помеченный как дубликат, отвечает на мой вопрос - у них нет нескольких столбцов с различным содержанием, а сам вопрос непосредственно касается фиктивных переменных и, кажется, не объясняет, что яЯ пытаюсь сделать здесь.

1 Ответ

0 голосов
/ 29 мая 2018

Я бы сначала установил имена столбцов для обработки:

names_to_proc <- c("emrA", "gyrA_8")

Давайте сконструируем функцию для создания нового набора из 1/0 столбцов для каждого из столбцов:

# @ col_name is one of the names_to_proc
AddCol <- function(df, col_name) {
    # split rows by delimeters
    string_to_proc <- df %>% select(!!col_name) %>%
       unlist() %>% str_split(regex("\\, |\\,")) 
    # find unique entries
    unique_strings <- string_to_proc %>%
       unlist() %>% unique()
    # construct names of the new columns
    cols_names <- paste(col_name, unique_strings, sep = "_")
    # construct 0/1-content columns for each unique entry
    cols_content <- sapply(function(i) {
            as.integer(unlist(lapply(function(Z) any(Z %in% unique_strings[i]), 
            X = string_to_proc)))
        }, X = seq_along(unique_strings))
    res <- data.frame(cols_content)
    names(res) <- cols_names
    return(res)
}

Наконец, примените функцию, чтобы получить наборы столбцов, которые должны заменить обработанные.Кадры данных 1/0, рассчитанные для каждого значения names_to_proc, связаны вместе с bind_cols():

# @ df_test is the initial data frame
cols_to_add <- sapply(function(i) {AddCol(df = df_test, col_name = names_to_proc[i])}, 
    X = seq_along(names_to_proc)) %>% 
    bind_cols()

Полученный блок добавляется в исходный кадр данных с некоторыми дополнительными преобразованиями для получения данных вжелаемый формат:

df_test %>% bind_cols(cols_to_add) %>% 
    select(-(2:3)) %>%
    select(-(emrY:T_CIP), everything())

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...