2014-11-26 5 views
5

Скажем, мой набор данных содержит три столбца: идентификатор (идентификатор), регистр (символ) и значение (числовое). Это мой набор данных:Выделение уровней факторной переменной в R

tdata <- data.frame(id=c(1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4), case=c("a","b","c","c","a","b","c","c","a","b","c","c","a","b","c","c"), value=c(1,34,56,23,546,34,67,23,65,23,65,23,87,34,321,56)) 

tdata 
    id case value 
1 1 a  1 
2 1 b 34 
3 1 c 56 
4 1 c 23 
5 2 a 546 
6 2 b 34 
7 2 c 67 
8 2 c 23 
9 3 a 65 
10 3 b 23 
11 3 c 65 
12 3 c 23 
13 4 a 87 
14 4 b 34 
15 4 c 321 
16 4 c 56 

Если вы заметили, что для каждого ID у нас есть два c. Как переименовать их c1 и c2? (Мне нужно провести различие между ними для дальнейшего анализа).

ответ

8

Как насчет:

within(tdata, case <- ave(as.character(case), id, FUN=make.unique)) 
+3

мне нравится это много. Я думаю, что дать то, что он ожидает, должно быть сделано в каждом наборе 'id'. Смотрите свое редактирование. Теперь это прекрасно. –

+0

@BondedDust исправлено, спасибо –

+0

Вы можете также обернуть его в 'sub', чтобы удалить' .' –

2

Я хотел бы предложить, что вместо того, чтобы заменить значения в столбце «случай», вы просто добавить дополнительный столбец «ID». Это легко сделать с getanID из моего пакета «splitstackshape».

library(splitstackshape) 
getanID(tdata, c("id", "case"))[] 
#  id case value .id 
# 1: 1 a  1 1 
# 2: 1 b 34 1 
# 3: 1 c 56 1 
# 4: 1 c 23 2 
# 5: 2 a 546 1 
# 6: 2 b 34 1 
# 7: 2 c 67 1 
# 8: 2 c 23 2 
# 9: 3 a 65 1 
# 10: 3 b 23 1 
# 11: 3 c 65 1 
# 12: 3 c 23 2 
# 13: 4 a 87 1 
# 14: 4 b 34 1 
# 15: 4 c 321 1 
# 16: 4 c 56 2 

[] может или не может потребоваться в зависимости от того, какой версии «data.table» вы установили.

Если вы действительно действительно хотели свернуть эти столбцы, вы также можете сделать:

getanID(tdata, c("id", "case"))[, case := paste0(case, .id)][, .id := NULL][] 
#  id case value 
# 1: 1 a1  1 
# 2: 1 b1 34 
# 3: 1 c1 56 
# 4: 1 c2 23 
# 5: 2 a1 546 
# 6: 2 b1 34 
# 7: 2 c1 67 
# 8: 2 c2 23 
# 9: 3 a1 65 
# 10: 3 b1 23 
# 11: 3 c1 65 
# 12: 3 c2 23 
# 13: 4 a1 87 
# 14: 4 b1 34 
# 15: 4 c1 321 
# 16: 4 c2 56 
2

Как об этом слегка модифицированном подходе:

library(dplyr) 

tdata %>% group_by(id, case) %>% mutate(caseNo = paste0(case, row_number())) %>% 
    ungroup() %>% select(-case) 

#Source: local data frame [16 x 3] 
# 
# id value caseNo 
#1 1  1  a1 
#2 1 34  b1 
#3 1 56  c1 
#4 1 23  c2 
#5 2 546  a1 
#6 2 34  b1 
#7 2 67  c1 
#8 2 23  c2 
#9 3 65  a1 
#10 3 23  b1 
#11 3 65  c1 
#12 3 23  c2 
#13 4 87  a1 
#14 4 34  b1 
#15 4 321  c1 
#16 4 56  c2 
+0

У меня был подобный подход. 'mutate (tdata, case = as.character (case))%>% group_by (id)%>% mutate (case = ifelse (case ==" c ", paste (case, row_number(), sep =". "), case)) 'Таким образом, вы можете оставить a и b такими, какие они есть, и сделать различия между двумя cs. – jazzurro

+0

@jazzurro, но это не привело бы к c1 и c2, но, для id 1, в c3 и c4, правильно? –

+0

Yep.Ино вы присваиваете номера всем или номерам только cs. – jazzurro

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