功能损坏/逻辑矢量-r

时间:2017-09-22 15:58:11

标签: r for-loop

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 个答案:

答案 0 :(得分: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