【问题标题】:sapply and apply give different results with is.character()sapply 和 apply 使用 is.character() 给出不同的结果
【发布时间】:2017-07-16 23:36:44
【问题描述】:

我试图将我的数据框的特征转换为字符类型并发现这篇文章:
tolower
我在几个 data.frames 上构建了一个函数,最后发现我的所有特征都被视为字符!

mytolower <- function(p_vector){
  if (is.character(p_vector)) return(tolower(iconv(enc2utf8(p_vector), sub = "byte")))
  else return(p_vector)
}
for (df in c("train", "test")) as.data.frame(apply(get(df), 2, function(x) mytolower(x)), stringsAsFactors = FALSE)

在 Stackoverflow 上看起来更好,我发现这篇第二篇文章通过使用 lapply 部分解决了这个问题,但奇怪的是,这表明 apply 和 sapply 以类似的方式工作
lapply rather than apply
因此,我终于建立了这个基本上说明我的麻烦的例子:

train <- data.frame(v1=1:3, v2=c("a","b","c"), v3=11:13, stringsAsFactors = FALSE)
str(train)
apply(train, 2, function(x) is.character(x)) #wrong
lapply(train, function(x) is.character(x)) #right
sapply(train, function(x) is.character(x)) #right
sapply(train, is.character) #right

虽然 apply 会将所有特征视为“字符”,但 lapply 或 sapply 将能够区分数字和字符特征。为什么会这样?有没有办法让 apply 找到正确的答案? 谢谢

【问题讨论】:

    标签: r character apply


    【解决方案1】:

    在应用is.character() 之前,首先将train 强制转换为矩阵。由于矩阵只包含单一类型的对象,因此所有元素都成为字符串。

    来自apply()的帮助文件:

    如果 X 不是一个数组,而是一个具有非空 dim 值的类的对象(例如数据框),则应用尝试通过 as.matrix 将其强制转换为二维数组(例如, 一个数据框) 或通过 as.array.

    我建议使用dplyr 中的mutate_if() 函数。

    library(dplyr)
    mutate_if(train, is.character, toupper)
    
    #    v1 v2 v3
    #    1  1  A 11
    #    2  2  B 12
    #    3  3  C 13
    

    【讨论】:

      【解决方案2】:

      apply 函数需要一个矩阵或数组作为输入,它会强制转换您输入的数据帧,并且 as.matrix() 转换会将所有数组转换为字符数组,因为所有列都是字符类型。

      【讨论】:

        猜你喜欢
        • 2021-04-08
        • 1970-01-01
        • 1970-01-01
        • 2012-07-12
        • 2021-09-25
        • 2023-03-30
        • 1970-01-01
        • 2011-04-03
        • 2015-08-26
        相关资源
        最近更新 更多