每个函数返回错误的逻辑值

时间:2018-03-17 23:56:30

标签: r

我正在尝试集成2个功能。 第一个是检查变量是否为哑 第二个适用于数据框并根据每列的值返回打印语句(虚拟或非虚拟)。 虚函数适用于单个变量(例如df $ var1),但是当我尝试在数据帧上使用第二个时,它表明所有变量都是虚拟的。 这里是代码

一些随机生成的数据

level=c("Strongly Agree", "Agree", "Neither agree or disagree","Disagree", "Strongly disagree",NA)
df <- data.frame(pre_1=as.character(sample(c("Yes","No", NA), 20, replace = T)), 
                                    pre_2=as.character(sample(level, 20, replace = T)),
                                    post_1=as.character(sample(level, 20, replace = T)),
                                    post_2=as.character(sample(level, 20, replace = T)),
                                    stringsAsFactors=T)

这里是虚函数

dummy <- function(v, naVal = NULL) { 
  v1 <- na.omit(v)
  # remove NA's
  v2 <- as.integer(as.factor(v1))
  if( !is.numeric(v2) ) stop("Only numeric vectors are accepted.")
  # get unique values
  v_unique <- unique(v2)
  # remove 'naVal's
  v_unique2 <- v_unique[! v_unique %in% naVal]
  # count number of unique values and check whether all values are integers
  if ( length(unique(v_unique2)) > 2L || 
       any(as.integer(v_unique2) != v_unique2) ) FALSE else TRUE
}

这里是df的打印功能

data_dummy <- function(df) {
    df = select(df, starts_with("pre_")) 
    for (i in 1:ncol(df)){
      if (dummy(as.character(df[i]))==TRUE) {print ("dummy")}
      else {print ("not dummy")}}
}

期望值应为1“虚拟”1“非虚拟”。 现实:

[1] "dummy"
[1] "dummy"

1 个答案:

答案 0 :(得分:1)

这是一个非常常见的错误,如果事情没有按照你期望的方式工作,那么请注意这个错误。当您希望提取向量时,使用[i]提取数据框。要提取矢量,请使用$name[[i]]。这是需要更改最少字符的修复:

data_dummy <- function(df) {
  df = select(df, starts_with("pre_")) 
  for (i in 1:ncol(df)){
    if (dummy(as.character(df[[i]]))==TRUE) {print ("dummy")}
    else {print ("not dummy")}}
data_dummy(df)
# [1] "dummy"
# [1] "not dummy"

但是,如果您想练习防御性编程,请避免使用括号来提取。这可以防止不可避免的拼写错误,而且我认为这也使它更具可读性。如果要循环遍历数据框的列,请执行此操作。特别注意for (col in df)

data_dummy <- function(df) {
    df = select(df, starts_with("pre_"))
    for (col in df){
        if (dummy(as.character(col)) == TRUE) print("dummy")
        else print("not dummy")
    }
}
data_dummy(df)