2013-12-20 2 views
1

Я пытаюсь написать функцию в R, которая объединяет столбцы видов вместе в data.frame.Использование функции для добавления столбца в R data.frame

(Чтобы немного рассказать о том, что я делаю ... У меня есть кадр данных с несколькими видами растений для нескольких сайтов и лет. Некоторые из видов были ошибочно идентифицированы, поэтому я хотел бы сгруппировать в более общий уровень (например, spp a и spp b были замешаны на протяжении многих лет, поэтому я хотел бы создать новый столбец spp.ab, в котором данные для spp a и b сгруппированы вместе)).

Пример:

spp.a spp.b 
    1  0 
    2  3 
    0  4 
    3  2 
    4  5 

Я хотел бы в конечном итоге с одного столбца, который отображает максимум от значения из двух видов:

spp.ab 
    1 
    3 
    4 
    3 
    5 

Я начал писать функцию который делает это; тем не менее, я беспокоюсь о добавлении нового столбца в свой набор данных и опускании старых. Может ли кто-нибудь сказать мне, что не так с моим кодом?

lump <- function(db, spp.list, new.spp) { #input spp.list as c('spp.a', 'spp.b', ...) 
    mini.db <- subset(db, select=spp.list); 
    newcol <- as.vector(apply(mini.db, 1, max, na.rm=T)); 
    db$new.spp <- newcol 
    db <- db[,names(db) %in% spp.list] 
    return(db) 
} 

Когда я называю эту функцию в качестве такой

test <- lump(db, c('spp.a', 'spp.b'), spp.ab) 
test 

все, что всплывает является mini.db. Я что-то теряю с возвратом()?

Для справки, db - это база данных, spp.list - это вид, который я хочу объединить вместе, а new.spp - это то, что я хотел бы назвать новым столбцом.

Спасибо за любую помощь,
Пол

ответ

1

Я понял это ... глупая ошибка, конечно. Вот код, который работает:

lump <- function(db, spp.list, new.spp) { #input spp.list as a c('spp.a', 'spp.b', ...), and new.spp must be in quotes (e.g. 'new.spp') 
    mini.db <- subset(db, select=spp.list); 
    newcol <- as.vector(apply(mini.db, 1, max, na.rm=T)); 
    newcol[newcol==-Inf] <- NA; 
    db[new.spp] <- newcol; 
    db <- db[, !names(db) %in% spp.list]; 
    return(as.data.frame(db)); 
} 

Ключ находится в db[new.spp] <- newcol; линии. Очевидно, использование этого работает, но с использованием db$new.spp <- newcol нет. Затем я также добавил ! в строку db <- db[,!names(db) %in% spp.list]. Это была моя самая большая ошибка.

+0

Итак, 'new.spp' - это имя нового столбца? –

+0

Правильно, и вы можете называть его любым, как хотите, поместив имя в кавычки в качестве аргумента функции. Например, если вы хотите называть его el.conquistador, вы должны ввести lump (db, c ('spp.a', 'spp.b'), 'el.conquistador') – logicForPresident

0

Хотя кажется, что вы нашли ответ на свой вопрос, я хотел бы предложить, вместо этого, в pmax функцию:

> with(db, pmax(spp.a, spp.b)) 
[1] 1 3 4 3 5 

Вы можете использовать это с within или transform, чтобы имитировать вашу функцию:

out <- within(db, spp.ab <- pmax(spp.a, spp.b)) 
out 
# spp.a spp.b spp.ab 
# 1  1  0  1 
# 2  2  3  3 
# 3  0  4  4 
# 4  3  2  3 
# 5  4  5  5 
Смежные вопросы