假设我有一个数据框:
mydf <- data.frame(colA = c(1,20), colB = c("a", "ab"), colC = c(T, F))
现在假设我想对数据框上的每一行应用一个函数。此函数使用 C 列的 bool 值。当使用
apply
时,每个非字符串都转换为列中存在的最大长度的字符串:> apply(mydf, 1, '[', 3)
[1] " TRUE" "FALSE"
字符串
" TRUE"
不再可以解释为逻辑。> ifelse(apply(mydf, 1, '[', 3), 1, 2)
[1] NA 2
我可以用
gsub(" ", "", x)
解决这个问题,但我敢打赌有更好的方法。为什么apply
当它可以直接将逻辑转换为字符串时有这种行为吗?有没有apply
-like 没有上述行为的函数?
最佳答案
当您调用 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
关于r - 为什么 apply 将数据帧中的逻辑转换为 5 个字符的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25854139/