嘿,社区真棒,
我正在尝试学习如何使用循环遍历数据集的各个方面。我正在使用为机器学习免费提供的sns数据集,并尝试运行k均值聚类分析。我要做的第一件事是将变量居中并缩放。我想使用循环来执行此操作,并且需要选择数据集中的所有前四个变量。这是我尝试过的方法,我不确定为什么它不起作用:
for(i in names(sns.nona[, -c(1:4)])){
scale(i, center = TRUE, scale = TRUE)
}
Error in colMeans(x, na.rm = TRUE) : 'x' must be numeric
我收到上述错误,这必须表示它没有选择数据集的实际列,而只是选择名称。我想我应该期望如此,但是如何使它引用数据?
编辑:我也尝试过:
for(i in names(sns.nona)[-c(1:4)]){
scale(sns.nona[,i], center = TRUE, scale = TRUE)
}
这没有返回错误,但似乎没有使数据居中。如果原始值为0,我应该得到一些负值,因为我会从中减去列的平均值...
答案 0 :(得分:2)
在应用比例尺后,您可能需要将结果分配回去
for(i in names(df)[-(1:4)]){
df[, i] <- scale(df[,i], center = TRUE, scale = TRUE)
}
或者您可以使用lapply
df[-(1:4)] <- lapply(df[-(1:4)], scale, center = TRUE, scale = TRUE)
,使用dplyr
我们可以。使用mutate_at
library(dplyr)
df %>% mutate_at(-(1:4), scale, center = TRUE, scale = TRUE)
答案 1 :(得分:2)
一种避免编写循环的方法:
scale(data[-1:-4])
此外,如果您要执行此操作,同时又允许自己修改选定的列而无需创建新的数据框:
data[-1:-4] <- lapply(data[-1:-4], scale)
答案 2 :(得分:2)
您可以使用tidyverse
软件包家族,这是我在R中所做的几乎所有事情所使用的软件包。
现在开始使用imo永远不会太早。
require(tidyverse)
#Convert sns.nona to tibble (robust data format which we can do cool stuff to)
sns.nona = as.tibble(sns.nona)
#Do cool stuff: mutate_at("columns to change","function to apply to columns")
sns.nona = sns.nona %>%
mutate_at(5:(ncol(sns.nona)),function(x) scale(x, center = T, scale = T))
NB不会被%>%
吓到。基本上x %>% function(y,z)
等效于function(x,y,z)