создание функций с аргументами в качестве имен столбцов - PullRequest
0 голосов
/ 10 октября 2018

Я пытаюсь создать функцию, которая выполнит парное сравнение значений одного столбца с другим и создаст новый вектор в зависимости от этих значений.Я не могу понять, как разрешить двум аргументам быть именами столбцов, которые затем можно изменить, и функцию можно использовать в другом наборе столбцов.Особая ситуация состоит в том, что для родительской птицы есть четыре столбца цветных меток полос (pbc1 ... pbc4) и еще четыре для ее птенца (obc1 ... obc4).Столбцы группы - это столбцы символов, таких как «G», «PG», «B» и т. Д. Это код первой части моей функции, которую я расширю, чтобы включить все парные сравнения после того, как я запустил это:

colourdistance1 <- function(df, refcoldistdf, pbc, obc){
    n <- length(pbc)
    coldist1 <- rep(NA,n)
    for(i in 1:n){
        if(pbc[i]==obc[i]){
            coldist1[i] <- 0
         } else if(pbc[i]=='M'|obc[i]=='M'){
             coldist1[i] <- NA
         } else if(pbc[i]=='G'& obc[i]=='PG'| obc[i]=='G'& pbc[i]=='PG'){
             coldist1[i] <- refcoldistdf[2,2]
         } else {
             coldist1[i] <- NA
         }
    }
}

p1o1 <- colourdistance1(bd_df, refcoldistdf,pbc = pbc1, obc = obc1)

Этот вызов просто возвращает объект p1o1 как NULL. Я также пытался:

colourdistance1 <- function(df, refcoldistdf, pbc, obc){
    n <- length(pbc)
    coldist1 <- rep(NA,n)
    for(i in 1:n){
        if(df$pbc[i]==df$obc[i]){
            coldist1[i] <- 0
        } else if(df$pbc[i]=='M'|df$obc[i]=='M'){
            coldist1[i] <- NA
        } else if(df$pbc[i]=='G'& df$obc[i]=='PG'| df$obc[i]=='G'& df$pbc[i]=='PG') { 
            coldist1[i] <- refcoldistdf[2,2]
        } else {
            coldist1[i] <- NA
        }
    }
}

Но это просто выдает эту ошибку:

Error in if (df$pbc[i] == df$obc[i]) { : argument is of length zero

Я перепробовал всекод за пределами функции, вставка имен столбцов и номер индекса и имя df, и все это работает.Это заставляет меня думать, что у меня есть проблема с аргументами функции, не соединяющимися с кодом функции, как я планировал.Любая помощь будет оценена !!

Воспроизводимые данные испытаний:

pbc1 <- c('B','W','G','R')
obc1 <- c('Y','W','PG','FP')
pbc2 <- c('W','W','W','M')
obc2 <- c('M','W','R','R')
pbc3 <- c('W','K','FP','K')
obc3 <- c('G','PG','B','PB')
pbc4 <- c('K','K','B','M')
obc4 <- c('K','PG','W','M')
testbanddf <- cbind(pbc1,obc1,pbc2,obc2,pbc3,obc3,pbc4,obc4)
testrefcoldist <- diag(11)

1 Ответ

0 голосов
/ 10 октября 2018

Итак, нужно сделать несколько комментариев, но сначала вы можете попробовать это:

pbc1 <- c('B','W','G','R')
obc1 <- c('Y','W','PG','FP')
pbc2 <- c('W','W','W','M')
obc2 <- c('M','W','R','R')
pbc3 <- c('W','K','FP','K')
obc3 <- c('G','PG','B','PB')
pbc4 <- c('K','K','B','M')
obc4 <- c('K','PG','W','M')
testbanddf <- data.frame(pbc1,obc1,pbc2,obc2,pbc3,obc3,pbc4,obc4)
testrefcoldist <- diag(11)

colourdistance1 <- function(df, refcoldistdf, pbc, obc){
    n <- nrow(df)
    coldist1 <- rep(NA,n)

    pbc <- df[[pbc]]
    obc <- df[[obc]]

    for(i in 1:n){
        if(pbc[i]==obc[i]){
            coldist1[i] <- 0
        } else if(pbc[i]=='M'|obc[i]=='M'){
            coldist1[i] <- NA
        } else if(pbc[i]=='G'& obc[i]=='PG'| obc[i]=='G'& pbc[i]=='PG'){
            coldist1[i] <- refcoldistdf[2,2]
        } else {
            coldist1[i] <- NA
        }
    }
    coldist1
}

colourdistance1(testbanddf, testrefcoldist,pbc = "pbc1", obc = "obc1")
  1. cbind() создает матрицу, а не фрейм данных.Вы создаете фреймы данных с помощью функции data.frame().
  2. . Самый простой путь вперед - сделать аргументы pbc и obc равными символам , представляющим имена столбцов.
  3. Ссылка на столбцы фрейма данных с использованием $ полезна при интерактивной работе, но не так полезна (как вы обнаружили) при написании функций и заранее не знает имен столбцов.В этом случае вы используете [[ и можете выбирать их по имени или положению.
  4. Как написано, ваша функция явно не возвращала coldist1.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...