如何通过变量索引数据框的列?

5

例如,我想要一个函数,它可以遍历数据框中的列,并打印出每个列的数据类型(例如,“numeric”、“integer”、“character”等)

如果没有变量,我知道我可以使用class(df$MyColumn)并获取数据类型。如何更改它,使“MyColumn”成为变量?

我尝试的是

f <- function(df) {

 for(column in names(df)) {
   columnClass = class(df[column])
   print(columnClass)
 }

}

但是这只会为每列打印出[1] "data.frame"
4个回答

7

由于数据框仅仅是一个列表,您可以使用lapply循环遍历每一列,并对每一列应用class函数:

lapply(df, class)

为了解决用户评论中以前未曾提及的问题.... 如果你构建一个执行希望对列进行的任何操作的函数,那么这将成功:
func <- function(col) {print(class(col))}
lapply(df, func)

这句话的意思是:“它大部分等价于:”

这涉及到IT技术相关内容。
 for(col in names(df) ) { print(class(df[[col]]))} 

这样就不会有一个不必要的“colClass”变量混乱在.GlobalEnv中了。


虽然我看到了这种方法的优雅之处,并且它确实解决了我提供的示例,但它并没有真正回答我的问题,而smu的答案则有。实际上,我需要做的不仅仅是打印出每一列。 - User

4
column之前使用逗号:
for(column in names(df)) {
   columnClass = class(df[,column])
   print(columnClass)
 }

1
正如DWin所建议的那样。
apply(df,2,class)

但是你说你想要在每一列上做更多的事情? 你想做什么?尽量避免抽象的例子。 如果有帮助的话

apply(df,2,mean)
apply(df,2,sd)

或者更加复杂的内容

apply(df,2,function(x){s = c(summary(x)["Mean"], summary(x)["Median"], sd(x))})

请注意,summary函数已经提供了大部分功能,但这只是一个例子。任何函数都可以放在apply内并迭代矩阵或数据框的列。该函数可以是您需要的任何复杂度或简单度。

1
如果所有列具有相同的类,则“apply”才能提供正确答案。这是因为“apply”旨在处理无法混合类型的矩阵和数组。在您的答案中,“df”将在应用每列的“class”之前被转换为矩阵。例如:apply(iris,2,class) - Joshua Ulrich

0
你可以使用 plyr 包的 colwise 函数将任何函数转换为列函数。这是 lapply 的一个包装器。
library(plyr)

colwise.print.class<-colwise(.fun=function(col) {print(class(col))})

colwise.print.class(df)

您可以查看创建的函数

print(colwise.print.class)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接