Как изменить строки фрейма данных - заменить одно значение другим - PullRequest
2 голосов
/ 13 мая 2010

У меня проблемы с тем, что я считаю основной задачей R.

Вот мой примерный кадр данных с именем 'b'

Winner Color Size
Tom Yellow Med
Jerry Yellow Lar
Jane Blue Med

где элементы в столбце Победитель являются факторами.

Я пытаюсь изменить "Том" в кадре данных на "Том LLC", и я не могу этого сделать.

Вот что я попробовал:

Простой способ: b$winner[b$winner=='Tom'] = as.factor('Tom LLC')

но это не удалось с "недопустимым уровнем фактора, сгенерированы NA"

Далее я попробовал более продвинутый маршрут:

name_reset = function (x, y, z) {
if (x$winner == y) {x$winner = z}
}

b = adply(b,1,name_reset,'Tom','Tom LLC')

но это не удалось с "Ошибка в list_to_dataframe (res, attr (.data," split_labels ")) Результаты не равны длины "

Я чувствую, что упускаю что-то простое. Может кто-то перенаправить меня или предложить предложения по коду, который я написал выше? Большое спасибо

Ответы [ 2 ]

9 голосов
/ 13 мая 2010

Что вы хотите сделать, это изменить значения с помощью уровней. Уровни дает вам доступ к меткам в фактор. При вызове фактора отображаются метки, а при назначении функции уровней метки фактора перезаписываются.

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

Попробуйте это:

levels(b$Winner) <- gsub("Tom", "Tom LLC", levels(b$Winner))

-mcpeterson

3 голосов
/ 13 мая 2010

Я создал ваш фрейм данных, а затем использовал dput(), чтобы преобразовать его в формат, который позволит людям легко копировать / вставлять его из Интернета:

b <- structure(list(Winner = c("Tom", "Jerry", "Jane"), Color = c("Yellow", 
"Yellow", "Blue"), Size = c("Med", "Lar", "Med")), .Names = c("Winner", 
"Color", "Size"), row.names = c(NA, -3L), class = "data.frame")

Я не уверен, что именно означает as.factor() в вашем коде. as.factor преобразует векторы значений в факторы - на самом деле это ничего не значит для одного значения. Если b $ Winner - символьный вектор, это работает:

b$Winner[dat$Winner %in% "Tom"] <- "Tom LLC"

Если b $ Winner является фактором, то «Том LLC» должен быть одним из уровней, чтобы вы могли вставить его в фактор. Если b $ Winner является фактором, я бы, вероятно, сделал следующее:

levels(b$Winner) <- c("Tom LLC", "Jerry", "Jane")

, который просто говорит R, что возможные значения Winner (т.е. уровни b $ Winner) должны быть заменены. Некоторые из продвинутых пользователей R здесь предлагают установить для параметра stringsAsFactors значение FALSE ... и чем больше я использую R, тем больше я согласен. Намного проще манипулировать простыми строковыми векторами, а затем вставлять их в коэффициент по мере необходимости.

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