【问题标题】:each function return wrong logical value每个函数返回错误的逻辑值
【发布时间】:2018-03-18 08:16:36
【问题描述】:

我正在尝试集成 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 “dummy” 1 “not dummy”。 现实:

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

【问题讨论】:

    标签: r


    【解决方案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)
    

    【讨论】:

    • df[i] 和 df[[i]] 有什么区别??顺便说一句,它就像一个魅力。
    • 太棒了,回答。非常感谢
    • ?Extract?Extract.data.frame 是有用的读物​​,如果你想了解细节:)
    猜你喜欢
    • 1970-01-01
    • 2015-09-28
    • 1970-01-01
    • 1970-01-01
    • 2017-12-13
    • 2019-04-24
    • 2020-03-18
    • 1970-01-01
    • 2021-02-16
    相关资源
    最近更新 更多