apply()应用于data.frame的列

时间:2019-12-18 12:37:59

标签: r

对于data.frame列,我不太了解apply()的行为:

apply(mtcars, 2, is.numeric)
# mpg  cyl disp   hp drat   wt qsec   vs   am gear carb 
# TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 

apply(iris,   2, is.numeric)
# Sepal.Length  Sepal.Width Petal.Length  Petal.Width      Species 
# FALSE        FALSE        FALSE        FALSE        FALSE 

在两个表中都有数字数据,为什么结果不同?
此外,如果我在mtcars中添加一列,则会更改所有列的结果:

mtcars$colA <- 'charA'
apply(mtcars, 2, is.numeric)
# mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb  colA 
# FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE 

出于我的目的(确定列的类型),lapply可以完成工作(lapply(mtcars, is.numeric))-但我仍然想弄清楚在apply(df,2,myfunc)情况下发生了什么< / p>

1 个答案:

答案 0 :(得分:2)

根据FALSE的文档,

  

详细信息

     

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

由于这些对象只能容纳一个类,因此您将得到全部为数字的列,或者如果至少有一个非数字列,则将全部得到sapply。我们可以将其与apply(iris, 2, is.numeric) #Sepal.Length Sepal.Width Petal.Length Petal.Width Species # FALSE FALSE FALSE FALSE FALSE sapply(iris, is.numeric) #Sepal.Length Sepal.Width Petal.Length Petal.Width Species # TRUE TRUE TRUE TRUE FALSE 的结果进行比较,

git clone example.repo