is.character在其适用的因素中返回TRUE

时间:2018-02-13 09:48:10

标签: r character apply

我有下一个数据帧:

df <- data.frame(Region = c("ES", "ES", "FRA", "FRA"), 
             Amount = c(1000,1200, 1100, 900))

其结构是:

'data.frame':   4 obs. of  2 variables:
$ Region: chr  "ES" "ES" "FRA" "FRA"
$ Amount: num  1000 1200 1100 900

如果我在is.character()上使用df$Region功能,我会FALSE,但如果我在apply()使用相同的功能,我会TRUE,甚至在第二列是一个数字。

使用的代码:

apply(df, 2, is.character) 

Region Amount 
  TRUE   TRUE 

我不明白为什么会这样。

2 个答案:

答案 0 :(得分:4)

apply的文档说:

  

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

as.matrix(df)的结果是:

> as.matrix(df)
     Region Amount
[1,] "ES"   "1000"
[2,] "ES"   "1200"
[3,] "FRA"  "1100"
[4,] "FRA"  " 900"

作为as.matrix州的文档:

  

as.matrix是一个通用函数。如果只有原子列和任何非(数字/逻辑/复杂)列,将as.vector应用于因子并格式化为其他非字符列,则数据帧的方法将返回字符矩阵。

使用适用于lapply列的data.frame而不转换为矩阵时,您会得到正确的结果:

> lapply(df, is.character)
$Region
[1] FALSE

$Amount
[1] FALSE

答案 1 :(得分:2)

申请家庭可能有点令人困惑。

您可以使用map中的purrr tidyverse来迭代。

这里我使用map_df来返回数据框。

df <- data.frame(Region = c("ES", "ES", "FRA", "FRA"), 
                 Amount = c(1000,1200, 1100, 900))

purrr::map_df(.x = df, .f = is.character)
#> # A tibble: 1 x 2
#>   Region Amount
#>   <lgl>  <lgl> 
#> 1 F      F

您可以详细了解purrr here