R - 使用在另一个数据帧上运行的函数在一个数据帧上循环

时间:2014-08-01 14:34:31

标签: r loops apply

我有一个数据帧df1,我希望按行循环,这样我就可以用它来更新另一个数据帧df2。

我取df1的每一行并使用用户定义的函数来更新df2:

updateDF2 <- function (row_of_df1, df2) {
  # do something to df2 conditional on df1's columns
  assign('df2',df2,envir=.GlobalEnv)
}

注意上面的“assign”更新df2。 为了测试用户定义的函数updateDF2,我从df1中取出一个随机行并将其分配给一个新的向量。然后我用new vector和df2作为参数调用updateDF2。这一直没有问题。

这是我遇到问题的循环。我收到错误消息

  

row_of_df1中的错误$ Column_of_condition:$运算符对原子向量无效

当我使用

apply(df1, 1, function(x) updateDF2(row_of_df1=x, df2=df2))

使用

时会发生同样的错误
apply(df1[1,], 1, function(x) updateDF2(row_of_df1=x, df2=df2))

但如果我使用

new_vector <- df1[1,]
updateDF2(new_vector, df2)

没有错误。这有什么区别?

由于df1的各行与用户定义的函数一起工作,我是否需要在df1行上显式写一个循环,或者我可以使用apply系列命令之一使其工作吗?

1 个答案:

答案 0 :(得分:1)

由于您未提供任何数据或任何有意义的代码,因此这只是猜测。

apply(...)函数将其第一个参数强制转换为矩阵并按行进行处理(如果第二个参数为1)。因此传递给FUN的行是原子向量,而不是数据帧的行。你可以看到如下:

df <- data.frame(x=1:10, y=rnorm(10), z=rpois(10,4))
class(df[1,])
#[1] "data.frame"
apply(df[1,],1,class)
#         1 
# "numeric" 

在您的函数updateDF2(...)中,您可能会将row_of_df1的元素称为row_of_df1$A等,其中A是列的名称在df1。这不适用于原子矢量。例如,您可以使用row_of_df1["A"]row_of_df1[1],但不能使用$运算符。

您还应该知道使用apply(...)还有其他问题。由于它强制矩阵的第一个参数,并且根据定义,矩阵中的所有元素必须具有相同的数据类型,如果df1具有character类型的任何列,整个矩阵将是强迫character