假设我有一个数据框:
mydf <- data.frame(colA = c(1,20), colB = c("a", "ab"), colC = c(T, F))
现在假设我想对数据框中的每一行应用一个函数。此函数使用列C的布尔值。使用时apply,每个非字符串都将转换为该列中存在的最大长度的字符串:
> apply(mydf, 1, '[', 3)
[1] " TRUE" "FALSE"
该字符串" TRUE"不再可解释为逻辑。
> ifelse(apply(mydf, 1, '[', 3), 1, 2)
[1] NA  2
我可以用来解决此问题gsub(" ", "", x),但我敢肯定有更好的方法。为什么apply仅将逻辑直接转换为字符串时会有这种行为?是否存在apply不具有上述行为的类似函数?
调用时apply,您的数据框已转换为字符矩阵。出现空格是因为每个元素都被转换为列中最宽元素的宽度。
您可以通过类似for循环的sapply调用来实现
> ( s <- sapply(seq(nrow(mydf)), function(i) mydf[i, 3]) )
# [1]  TRUE FALSE
> class(s)
# [1] "logical"
一种解决方法apply是
> as.logical(gsub("\\s+", "", apply(mydf, 1, `[`, 3)))
# [1]  TRUE FALSE
但请注意,这两者与
> mydf[,3]
# [1]  TRUE FALSE