首页 文章

功能损坏/逻辑矢量-r

提问于
浏览
0
num_only <- function(df) {

for (clm in seq_along(df)) {
  num_cols <- vector("logical", length = ncol(df))
  num_cols[[clm]] <-ifelse(length(grep('[aA-zZ]', df[[clm]])) == 0, TRUE, 
FALSE) 

}
  return(num_cols)
}

上述函数应该返回一个逻辑向量,告诉我数据框中的列是否只有数字字符 . 但是,当我为第一列(甚至是前两列)运行它时,它似乎返回一个不正确的值 .

mydf <- data.frame(new = letters[11:20], 
               a = rnorm(10), 
               b = letters[1:10], 
               c = LETTERS[1:10], 
               d = rnorm(10))

当我输入上面的df时,它应该返回一个FALSE TRUE FALSE FALSE TRUE的逻辑向量,但是我得到了这个:

num_only(mydf)
[1] FALSE FALSE FALSE FALSE  TRUE

我不确定是什么问题 . 有人可以帮忙吗?

1 回答

  • 1

    您不希望 ifelse ,因为您一次只测试一个逻辑值 . 并且应该在 for 循环之外创建返回向量 .
    此外,还有一个更简单的 R-ish 解决方案,它不是等效的,但可以确定列是否属于 numeric 类 . 也许你是有意思的 .

    num_only <- function(df) {
        num_cols <- vector("logical", length = ncol(df))
        for (clm in seq_along(df)) {
            num_cols[[clm]] <-if(length(grep('[A-Za-z]', df[[clm]])) == 0)
                TRUE
            else
                FALSE
        }
        return(num_cols)
    }
    
    num_only2 <- function(df) unname(sapply(df, is.numeric))
    
    num_only(mydf)
    #[1] FALSE  TRUE FALSE FALSE  TRUE
    
    num_only2(mydf)
    #[1] FALSE  TRUE FALSE FALSE  TRUE
    

相关问题