遍历一些但不是全部的列?

时间:2019-05-12 02:05:00

标签: r loops

嘿,社区真棒,

我正在尝试学习如何使用循环遍历数据集的各个方面。我正在使用为机器学习免费提供的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,我应该得到一些负值,因为我会从中减去列的平均值...

3 个答案:

答案 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)