对于R数据框中的每一行

6 浏览
0 Comments

对于R数据框中的每一行

我有一个数据框,对于数据框中的每一行,我需要进行一些复杂的查找,并将一些数据附加到一个文件中。\n数据框包含了生物研究中使用的96孔板中所选井的科学结果,所以我想要做的是:\n

for (well in 数据框) {
  wellName <- well$name    # 类似于"H1"的字符串
  plateName <- well$plate  # 类似于"plate67"的字符串
  wellID <- getWellID(wellName, plateName)
  cat(paste(wellID, well$value1, well$value2, sep=","), file=outputFile)
}

\n在我的过程化世界中,我会这样做:\n

for (row in 数据框) {
    # 使用行中的数据查找信息
    # 将信息写入文件
}

\n在R中,有什么更好的方法来实现这个?

0
0 Comments

问题的原因是在R数据帧中对每一行进行操作时的循环方法。解决方法有以下几种:

1. 如果getWellID()函数是矢量化的,那么可以跳过循环,直接使用cat或write.csv函数。示例如下:

write.csv(data.frame(wellid=getWellID(well$name, well$plate), 
         value1=well$value1, value2=well$value2), file=outputFile)

2. 如果getWellID()函数不是矢量化的,可以使用by函数或apply函数。示例如下:

by(dataFrame, INDICES, function(x) { # do stuff })

3. 可以使用for循环的方式进行操作,示例如下:

for(i in 1:nrow(dataFrame)) {
    row <- dataFrame[i,]
    # do stuff with row
}

4. 可以尝试使用foreach包来进行操作,示例如下:

library(foreach)
d <- data.frame(x=1:10, y=rnorm(10))
s <- foreach(d=iter(d, by='row'), .combine=rbind) %dopar% d

5. 还可以使用plyr包中的函数,示例如下:

library(plyr)
ddply(dataFrame, .(x), function(x) { # do stuff })

对于getWellID函数是否可以矢量化的问题,可以单独发帖进行提问,肯定会有人回答。

即使getWellID函数不是矢量化的,也可以使用mapply函数来替代getWellID函数。示例如下:

mapply(getWellId, well$name, well$plate)

即使从数据库中获取数据,也可以一次性获取所有数据,然后在R中进行筛选,这样比使用迭代函数更快。

最后,使用foreach函数也是一个不错的选择。

0
0 Comments

原因:问题的原因是使用apply函数处理R数据框时,数据框会被转换为矩阵,导致传递给函数f的参数x变成了一个向量,而不是一个行。这就导致了在函数f中无法使用列名来引用列的数值。

解决方法:解决这个问题的方法是改用by()函数而不是apply()函数来处理数据框。因为by()函数返回的是一个数据框,而不是一个矩阵,这使得代码更加健壮。

整理后的文章如下:

你可以尝试使用apply()函数来解决这个问题。

> d
  name plate value1 value2
1    A    P1      1    100
2    B    P2      2    200
3    C    P3      3    300
> f <- function(x, output) {
 wellName <- x[1]
 plateName <- x[2]
 wellID <- 1
 print(paste(wellID, x[3], x[4], sep=","))
 cat(paste(wellID, x[3], x[4], sep=","), file= output, append = T, fill = T)
}
> apply(d, 1, f, output = 'outputfile')

但要注意,数据框会被转换为矩阵,而你得到的x是一个向量。这就是为什么上面的示例中必须使用数值索引的原因;而使用by()方法可以得到一个数据框,这使得代码更加健壮。

但这种方法对我没有起作用。apply函数将传递给f的每个x都视为字符值,而不是行。

还要注意的是,你也可以通过列名来引用列。所以,`wellName <- x[1]`也可以写成`wellName <- x["name"]`。

当Darren提到健壮性时,他指的是可以改变列的顺序。这个答案无法工作,而使用by()方法的答案仍然有效。

0
0 Comments

在R dataframe中对每一行进行操作的问题是常见的。通常,可以使用`by()`函数来实现这个目标。但是,直接对每一行进行迭代通常不是最佳选择,因为应该尽量使用向量化的方法来处理数据。

解决方法是使用`seq_len()`函数来代替`1:nrow(dataFrame)`,这样即使数据框中没有任何行,也能正常工作。具体而言,可以使用以下代码来处理这个问题:

by(dataFrame, seq_len(nrow(dataFrame)), function(row) dostuff)

需要注意的是,在这个代码中,`dostuff`是一个代表对每一行执行的操作的函数。关于如何实现这个函数,可以根据实际需要来确定。例如,可以使用`str(row)`来打印每一行的信息。

然而,需要注意的是,将`dostuff`更改为`row`并不会返回一个整体的数据框对象,而是返回一个包含一个行数据框的列表。

需要强调的是,并不是所有的操作都适合向量化。根据具体情况,选择合适的方法来处理数据是很重要的。

希望这些解释能够帮助你理解如何在R dataframe中对每一行进行操作。如果还有其他问题,请随时提问。

0