按名称迭代R中for循环中的列

时间:2018-02-02 01:47:11

标签: r dataframe

我有一个数据框,其中一些列是数字的,有些是不是,我试图编写一个for循环,从数字列中提取一些统计数据。

我无法弄清楚如何让循环将变量识别为列名。

这是我所拥有的要点:

for(c in names(Data)) {
    if(class(Data$c)=='numeric') {
            sd(Data$c)
    }
}

...但是类(Data $ c)返回'字符'每一次。

我意识到我可以用sapply来做这件事,但这让我烦恼!

3 个答案:

答案 0 :(得分:1)

问题可能是使用$代替[[。通过使用$,它会检查匹配c的列,而不是获取c内的值,即实际列名。因此,我们需要使用[[来存储目的

Data <- iris
out <- c() 
for(c in names(Data)) {
if(class(Data[[c]])=='numeric') {
        out <- c(out, sd(Data[[c]]))
  }
}

此外,函数is.numeric检查它是否为数字

out <- c()
for(c in names(Data)) {
if(is.numeric(Data[[c]])) {
      out <- c(out, sd(Data[[c]]))
  }
}

使用lapply/sapply循环遍历数据集的列,ifnumeric,然后获取列的sd

lapply(Data, function(x) if(is.numeric(x)) sd(x)) 

答案 1 :(得分:0)

听起来你有一个名为c的列,其中包含字符。 Data$c标识Data中名为c的列。如果您希望循环中c的当前值为names(),那就是Data[[c]]

我个人使用dplyr::summarise_if()

library(dplyr)
Data %>% 
  summarise_if(is.numeric, sd)

答案 2 :(得分:0)

data.frame的列应该是1个类:即所有character或全部numeric 使用c(1,2,3,"4")列时,会发生强制转换,您将获得character列...

所以,您需要numeric cast-able检查,而不是numeric checking

key <- LETTERS[1:10]
value <- c(1:9,"10")
df <- data.frame(key, value, key, value, value, stringsAsFactors=FALSE)

numeric.col <- which(!is.na(sapply(df, as.numeric)[1,]))
sapply(df[,numeric.col], sd)

enter image description here