2016-09-06 3 views
1

Моих данных выглядит следующим образом:использование состояния в кадре данных с «с» функцией в R

manager  date country gender age q1 q2 q3 q4 q5 agecat 
1  1 10/24/08  US  M NA 5 4 5 5 5 NA 
2  2 10.28/08  US  F 45 3 5 2 5 5 NA 
3  3 10/1/08  UK  F NA 3 5 5 5 2 NA 
4  4 10/12/08  UK  M 39 3 3 4 NA NA NA 
5  5 5/1/09  UK  F 99 2 2 1 2 1 NA 

Теперь я пытаюсь установить agecat = «старейшина», если возраст> 55. Я попытался следующие два набора кодов и получили разные результаты:

Код 1 (работал)

leadership$agecat[leadership$age > 55] <- "Elder" 

Код 2: (не работает)

with(leadership, { 
     agecat[age > 55] <- "Elder" 
    }) 

Может ли кто-нибудь помочь мне понять, в чем разница между двумя и почему вторая не работает? Большое спасибо!

+2

Также смотрите функцию 'cut()', если вы пытаетесь классифицировать непрерывную переменную. – MrFlick

+1

... и не забывайте при использовании 'inside', чтобы вернуть результаты к' leader' ... или попробуйте 'transform' ... –

ответ

3

Во-первых, ваше выражение with

    { 
    agecat[age > 55] <- "Elder" 
} 

возвращает результат незримо, и так как вы не назначили его там нет никаких изменений в любом месте. Есть много способов сделать это, и использование with в этой ситуации на самом деле кажется немного неуклюжим, потому что вам нужно будет сделать следующее. Обратите внимание, что столбец возвращается во вторую строку выражения.

leadership$agecat <- with(leadership, { 
    agecat[age > 55] <- "Elder" 
    agecat 
}) 

Не очень обтекаемый with вызов, имо. Вы можете немного почистить его

leadership$agecat <- with(leadership, replace(agecat, age > 55, "Elder")) 

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

leadership <- within(leadership, agecat[age > 55] <- "Elder") 

И как @BenBolker ноты, transform другой вариант. Это также дает полные обновленные данные, такие же, как within.

leadership <- transform(leadership,agecat = replace(agecat, age > 55, "Elder")) 

Короче говоря, это может быть лучше придерживаться вашего кодекса 1 кода для этого.

+1

...' лидерство <- transform (лидерство, agecat = заменить (agecat, возраст> 55, «Elder»)) ' –

+0

Оцените различные варианты. все сработало. Это отличная помощь, и спасибо всем за ответы! – Crystal

1

with создает среду для фрейма данных, так что вам не нужно повторно указывать имя фрейма данных для доступа к переменным в нем. В вашем случае вы создали переменную, но она исчезла при выходе из среды. Поэтому, как сказал Dirty Sock Sniffer, используйте within, который также создает среду, но возвращает фрейм данных. Таким образом, следующие работы:

leadership <- within(leadership, agecat[age > 55] <- "Elder") 

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

  • Нет связанных вопросов^_^