为什么将数据帧中的转换逻辑应用于5个字符的字符串?

Wil*_*son 5 r apply dataframe

假设我有一个数据框:

mydf <- data.frame(colA = c(1,20), colB = c("a", "ab"), colC = c(T, F))
Run Code Online (Sandbox Code Playgroud)

现在假设我想对数据框中的每一行应用一个函数。此函数使用列C的布尔值。使用时apply,每个非字符串都将转换为该列中存在的最大长度的字符串:

> apply(mydf, 1, '[', 3)
[1] " TRUE" "FALSE"
Run Code Online (Sandbox Code Playgroud)

该字符串" TRUE"不再可解释为逻辑。

> ifelse(apply(mydf, 1, '[', 3), 1, 2)
[1] NA  2
Run Code Online (Sandbox Code Playgroud)

我可以用来解决此问题gsub(" ", "", x),但我敢肯定有更好的方法。为什么apply仅将逻辑直接转换为字符串时会有这种行为?是否存在apply不具有上述行为的类似函数?

Ric*_*ven 5

调用时apply,您的数据框已转换为字符矩阵。出现空格是因为每个元素都被转换为列中最宽元素的宽度。

您可以通过类似for循环的sapply调用来实现

> ( s <- sapply(seq(nrow(mydf)), function(i) mydf[i, 3]) )
# [1]  TRUE FALSE
> class(s)
# [1] "logical"
Run Code Online (Sandbox Code Playgroud)

一种解决方法apply

> as.logical(gsub("\\s+", "", apply(mydf, 1, `[`, 3)))
# [1]  TRUE FALSE
Run Code Online (Sandbox Code Playgroud)

但请注意,这两者与

> mydf[,3]
# [1]  TRUE FALSE
Run Code Online (Sandbox Code Playgroud)