循环通过一些但不是所有的列? [复制]

Posted

技术标签:

【中文标题】循环通过一些但不是所有的列? [复制]【英文标题】:looping through some but not all columns? [duplicate] 【发布时间】:2019-09-29 10:19:00 【问题描述】:

嘿,很棒的社区,

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

【问题讨论】:

有什么理由需要使用循环吗? 只为我自己的熏陶。我也尝试使用 tidyr 来执行此操作,但是当我添加 one_of(-c(v1, v2, v3, v4)) 时,它说无论出于何种原因都找不到 v1。我实际上不介意同时看到它。这只是为我学习。 :) 你的最后一个代码应该可以工作,如果平均值为零,那么缩放它不会总是产生负值。或者如果平均值为负值,它可能会产生正值!无论如何,就使用 tidyr 而言,出现该错误的原因是 tidyr 不需要您引用变量名。所以如果你的变量名是Blah那么你可以做data %>% select(Blah) %>% transmute(Blah = scale()) 【参考方案1】:

您可能需要在应用比例后重新分配结果

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)

【讨论】:

找到了天才。是的,这行得通。这似乎是一个非常基本的概念。我会记住的。非常感谢!【参考方案2】:

一种避免编写循环的方法:

scale(data[-1:-4])

此外,如果您想在不创建新数据框的情况下修改选定列的同时执行此操作:

data[-1:-4] <- lapply(data[-1:-4], scale)

【讨论】:

【参考方案3】:

您可以使用 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 不要被%&gt;% 吓到。基本上x %&gt;% function(y,z) 等价于function(x,y,z)

【讨论】:

我对 tidyverse 有非常基本的了解。这很有帮助。我知道 mutate 函数非常高效,所以看看例子很好!

以上是关于循环通过一些但不是所有的列? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

javascript while循环正确迭代但具有相同逻辑的for循环不是,在具有整数值和一些空值的数组上

行中丢失数据的方法? [复制]

循环遍历列以获取基于标题的列号

循环更新查询 pdo where id

使用 flexbox,我可以有 1 个固定宽度的列和 1 个占用其余宽度的列吗? [复制]

如何使用两个不同的列 mySQL 从查询而不是其他查询中获取数据? [复制]