2015-12-06 6 views
0

У меня есть кадр данныхЗамена категориальных значений в векторе на номер

t = data.frame(c(5,5,5), c('a','b','c', 'a', 'b', 'd'), c(1,2,3), c(1,2,3)) 

И вектор с rownames

vector = table(t$V2) 

Как заменить второй категорический столбец в dataframe с номерами от вектора?

Я сделал некоторые Google Foo и попытался сделать следующее:

map = setNames(vector, rownames(vector)) 
to_replace = t$V2 
to_replace[] = map[unlist(map)] 

Но я получаю сообщение об ошибке:

Warning message: 
In `[<-.factor`(`*tmp*`, , value = c(146L, 146L, 27L, 82L, 110L, : 
    invalid factor level, NA generated 

EDIT

Извините, ребята, я не сделал ясно, что я хотел сделать

t $ V2 и вектор имеют разную длину. В основном вектор с именами ростов - это сама карта. Я хочу сопоставить имена ростов в векторе с значениями в t $ V2 и заменить его значениями вектора. Сам вектор был создан с использованием функции table (t $ V2).

+1

предположительно вы имеете в виду 'имен (вектор)' (не 'rownames (вектор)') в строке 3 –

+0

Я не уверен, но я редактировал свой пост, чтобы сделать его более четким. – YKY

+0

'rownames (vector)' создает ошибку как для меня, так и для @ 42 (см. Ниже) –

ответ

0

Когда я попытался выполнить rownames(vector) = c('a', 'b', 'c') У меня была ошибка. Функция rownames<- не будет успешной, если цель - всего лишь атомный вектор. Так что также означает, что map = setNames(vector, rownames(vector)) не удастся, так что нам нужно сделать, это:

map = setNames(vector, c('a', 'b', 'c')) # success 

Но теперь мы имеем еще одну проблему, потому что вы не говорите нам, что ожидать, что результат будет, и это map[unlist(map)] не очень разумно, как-то назначить:

> map[unlist(map)] # there are no 4 or 6 positon in `vector` or `map` 
    b <NA> <NA> 
    4 NA NA 

Если все, что вы хотели, чтобы заменить V2 с этим числовым вектором, было бы просто

t$V2 <- vector 
0

ли это то, что вы пытаетесь сделать?

t = data.frame(v1 = c(5,5,5), v2 = c('a','b','c'), v3 = c(1,2,3), v4 = c(1,2,3)) 
vector = c(2,4,6) 
row.names(t) <- vector 

print(t) 
# Output from print(t) 
    v1 v2 v3 v4 
2 5 a 1 1 
4 5 b 2 2 
6 5 c 3 3 
0

Ваша проблема заключается в том, что колонна intersest в вашем dataframe является тип factor. Проверьте следующий код с и без хешированной строки.

t <- data.frame(c(5,5,5), c('a','b','c'), c(1,2,3), c(1,2,3)) 
vector <- c(2,4,6,8) 
names(vector) <- c('a', 'b', 'c', 'd') 

# t[,2] <- as.character(t[,2]) 

for(i in 1:dim(t)[1]){ 
    t[i,2] <- vector[which(names(vector)==t[i,2])] 
}