【问题标题】:Looping through a column in R循环遍历 R 中的列
【发布时间】:2010-12-09 23:03:53
【问题描述】:

我正在使用R's stats 包,并希望循环通过all the rows of a dataframe 中的column[x],使用函数对列中each cell 中的数据进行操作并将结果传递给新列(使用new column中的calculated resultcolumn[x]中的数据对齐)

我有两个问题:

  1. 我无法让它工作
  2. 在我读过的R articles 中似乎不鼓励循环。是否有替代方法,如果没有,是否有人举例说明如何执行循环?

【问题讨论】:

  • 不一定不鼓励循环。先让它工作,然后再考虑是否更快。
  • 你能告诉我们更多细节吗?就像您正在处理的示例问题一样?

标签: r statistics loops


【解决方案1】:

没有任何例子,很难知道如何回应。但是,您所描述的基本情况是这样的:

#Just a very simple data frame
dat <- data.frame(x = c(1, 2, 3))
#Compute the squared value of each value in x
dat$y <- dat$x^2
#See the resultant data.frame, now with column y
dat

当您告诉 R 对向量(或类似向量的结构,如 dat$x)进行平方时,它知道分别对每个值进行平方。大多数情况下,您不需要显式地循环遍历这些值——尽管,正如 Dirk 所指出的,您应该只担心优化循环是否会导致您出现问题。也就是说,我当然更喜欢阅读和写作

dat$y <- dat$x^2

到:

for(i in 1:length(dat$x)){
  dat$y[i] <- dat$x[i]^2
}

...在可能的情况下。

【讨论】:

  • 谢谢。我可以让算术工作正常。我无法将数据框的内容传递给函数。这就是问题所在。这是框架的顶部(称为数据),标题为“compound”和“SMILES”(微笑是分子的文本表示) Compound_ID SMILES 12345 c1cccccc1 我想使用函数 parse.smiles() 来读取微笑并输出一个分子。如果我在一个分子上做它没问题 (junk
  • 好的。抱歉,不太确定你在 R 中的位置,所以我想我只是把基本案例扔在那里。 “未知”可能有 - 但如果没有,最好的办法是发布一个小样本数据集和函数。从描述中很难理解出了什么问题,而且我至少无法在没有实验的情况下正确获得任何 *apply 函数。
【解决方案2】:

如果 parse.smiles() 是一个你想应用于向量“vec”的所有条目的函数,那么你可以使用:

lapply(1:length(vec),parse.smiles(vec[i]))

【讨论】:

  • 谢谢大家。我感兴趣的专栏已被阅读为一个因素。我必须明确地告诉函数以字符的形式读取内容,直到指出我才意识到这一点。它现在正在工作。 (并为上面的乱码评论道歉 - 它被格式化为返回时消失)
【解决方案3】:

不鼓励循环的唯一原因是它很慢。 R 旨在一次处理向量,并具有许多功能来完成此任务。整个应用程序家族,以及 Vectorize 之类的功能都可以提供帮助。所以习惯用法是,如果您使用 for 循环,您不会在 R 中思考,但有时 for 循环确实是合适的。

要以 R 的思维方式执行此操作,请将您的函数向量化,如果它尚未向量化(请参阅 Vectorize 函数),则使用整个列作为参数调用该函数并将其分配给新列。

f<-Vectorize(function(x,...),'x')
data$newcolumn<-f(data[,1])

apply 系列(apply、sapply、lapply、mapply、tapply)也是替代品。大多数原生 R 函数已经向量化,但在传递应该被解释为向量的额外参数时要小心。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 1970-01-01
    相关资源
    最近更新 更多