2015-08-21 2 views
0

У меня есть dataframe, который содержит 3 столбца. Один из столбцов (элементов) включает в себя длинные строки (некоторые включают специальные символы, такие как точка с запятой, для простоты здесь написано как Tx), которые могут повторяться. Я хотел бы найти все уникальные значения конкретного столбца. Для каждого уникального значения для создания псевдонима в следующем формате: OV1, OV2, ... OVn. Я хотел бы сохранить эту таблицу и назвать ее «таблицей трансформации». На следующем шаге я хотел бы перейти в исходную таблицу и перекопировать каждое значение со значением в таблице преобразования.Перекодирование данных из таблицы трансформации

Ниже приведен пример для исходной таблицы:

items sequenceID  eventID SIZE 
1: T1  41595370    1 1 
2: T2  41595371    1 1 
3: T3  41595282    1 1 
4: T3  41595282    2 1 
5: T4  41595373    1 1 
6: T5  41595368    1 1 
7: T1  41595379    1 1 

В таблице результат был бы:

 items  sequenceID  eventID SIZE 
1: OV1  41595370    1 1 
2: OV2  41595371    1 1 
3: OV3  41595282    1 1 
4: OV3  41595282    2 1 
5: OV4  41595373    1 1 
6: OV5  41595368    1 1 
7: OV1  41595379    1 1 

В таблице преобразования будет:

1: T1 OV1 
2: T2 OV2 
3: T3 OV3 
4: T4 OV4 
5: T5 OV5 

Данные источника в data6 (dataframe). Я использовал следующие приказы:

u1 <- unique(data6$items) 
u1 <- data.frame(u1) 
ov <- c(paste("ov",1:nrow(u1),sep="")) 

Я бы сейчас, чтобы заменить все столбцы уникальных предметов, которая находится в u1 с OV значений и создать это в виде таблицы преобразования. Затем замените все значения в data6$items.

Большое спасибо за помощь.

ответ

1

Похоже, ваш «пункт» может рассматриваться в качестве факторной переменной, которая нуждается в новых меток. Если это так, вы можете избежать таблицы преобразования и перекодировать «элемент» в своем исходном информационном кадре:

data6$items = factor(data6$items, labels=paste0("OV", 1:length(unique(data6$items)))) 
+0

Большое спасибо. Кажется, команда работает. Однако, если я хотел бы изменить значения OV (новые значения) в следующем формате: OV1, OV2 и т. Д. Что мне нужно изменить в команде? и, кроме того, я получаю следующее предупреждение: - Почему? - Предупреждающее сообщение: В 'levels <-' (' * tmp * ', value = if (nl == nL) as.character (метки) else paste0 (метки: дублированные уровни в факторах устарели – Avi

+0

Я получаю Следующий после выполнения команды: элементов sequenceID коды события РАЗМЕРА 1: OV4CC 41595370 1 1 2: OVFCD 41595371 1 1 3: OV6A6 41595282 1 1 4: OV6A6 41595282 2 1 5: OV49A 41595373 1 1 6: OV990 41595368 1 1 – Avi

+0

Я изменил код, теперь уровни вновь созданной переменной OV1..OVn. Я не получаю никаких предупреждающих сообщений, используя ваши данные, возможно, вам нужно сначала определить переменную as.character(). – MarkusN

1

Вы можете создать таблицу преобразования с:

u1 <- as.data.frame(unique(data6$items)) 
names(u1) <- "items" 
u1$newitem <- paste0("OV", substr(u1$items,2,4)) 

это дает:

> u1 
    items newitem 
1 T1  OV1 
2 T2  OV2 
3 T3  OV3 
4 T4  OV4 
5 T5  OV5 

Теперь вы можете заменить соответствующие элементы в исходной таблице с:

data6$items = u1$newitem[match(data6$items,u1$items)] 

этой дает:

> data6 
    items sequenceID eventID SIZE 
1 OV1 41595370  1 1 
2 OV2 41595371  1 1 
3 OV3 41595282  1 1 
4 OV3 41595282  2 1 
5 OV4 41595373  1 1 
6 OV5 41595368  1 1 
7 OV1 41595379  1 1 

Если вы хотите изменить T с OV, вы можете просто сделать:

data6$items <- gsub("T", "OV", data6$items) 
+0

Большое спасибо. Но как я могу заменить значения соответствующих элементов в исходной таблице? – Avi

+0

@Avi см. Обновление – Jaap

+0

Спасибо. Однако содержимое элемента не так просто, как я показал здесь. Он не содержит только буквы Tx, в котором содержится длинная строка, которая может содержать даже точку с запятой (;). Я хотел бы изменить одно и то же значение на одно значение в формате OVx (т. Е. OV1, OV2 ...), поэтому, если одна и та же строка появляется в элементах в разных строках, она получит тот же OVi. – Avi

Смежные вопросы