【发布时间】:2018-10-09 21:17:25
【问题描述】:
我正在尝试创建一个函数,它将在一列的值与另一列的值之间进行成对比较,并根据这些值创建一个新向量。我无法弄清楚如何允许两个参数成为可以更改的列名,并且可以在另一组列上使用该函数。 具体情况是有四列彩色带标签用于父鸟(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)
【问题讨论】:
-
您不能使用
$引用传递给函数的参数 - 您需要使用[或[[。因此,您需要df[[pbc]]而不是df$pbc,您可以在其中调用函数和参数,例如colourdistance1(df, pbc="colname")
标签: r