我有一个数据帧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
系列命令之一使其工作吗?
答案 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
。