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
我不确定是什么错。有人可以帮忙吗?
答案 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