我有一个数据框,其中一些列是数字的,有些是不是,我试图编写一个for循环,从数字列中提取一些统计数据。
我无法弄清楚如何让循环将变量识别为列名。
这是我所拥有的要点:
for(c in names(Data)) {
if(class(Data$c)=='numeric') {
sd(Data$c)
}
}
...但是类(Data $ c)返回'字符'每一次。
我意识到我可以用sapply来做这件事,但这让我烦恼!
答案 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
循环遍历数据集的列,if
为numeric
,然后获取列的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)