假设我有一个数据框:
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句