R 中奇怪的 apply() 行为返回具有不同值范围的不同值,甚至当函数单独输入时?
Strange apply() behavior in R returning different values with different value ranges and even when function entered alone?
见过这种行为吗?为什么?
我先总结一下我的问题,然后再澄清一下:
我有一个有效的函数“my_function()”。当我单独使用它时,它总是有效。
当我在其上使用 apply() 时,有时会得到错误的输出。示例:
apply(working_data[933266:933267,], 1, my_function)
让我得到不需要的 NA。
apply(working_data[933265:933266,], 1, my_function)
工作正常。
apply(working_data[933267:933268,], 1, my_function)
工作正常。
为什么 apply() 会这样?
我会澄清更多:
我有一个工作正常的函数,它 returns 对我来说是一个命名的逻辑向量。
我将给出一个输出示例:
my_function(working_data[933267,])
320170356871 174173601732 172156573581 320004381381 320210363581 ...
FALSE FALSE FALSE FALSE FALSE ...
my_function(working_data[933266,])
320170356871 174173601732 172156573581 320004381381 320210363581 ...
FALSE FALSE FALSE FALSE FALSE ...
好的,这是正确的(没有 NA,并且两个示例之间的输出不同,我检查过,不要被那些重复的 FALSE 骗了你)。
现在我想将它应用于数据框的行。每当我这样做时,它都会工作一段时间,然后突然开始到处返回 NAs 并且永远! (请注意,我将使用与上面相同的索引):
apply(working_data[933266:933267,], 1, my_function)
| |933266 | 933267|
|-----|-------|--------|
|[1,] |FALSE | NA |
|[2,] |FALSE | NA |
|[3,] |FALSE | NA |
|[4,] |FALSE | NA |
|[5,] |FALSE | NA |
|... | ... | ... |
这是我看到的。事实上,我得到的是 933266 左边的所有内容(即从 1 到 933266)都是正确的,而 933267 右边的所有内容都是 NA。
预期的输出是这样的:
| |933266 | 933267|
|-----|-------|--------|
|[1,] |FALSE | FALSE |
|[2,] |FALSE | FALSE |
|[3,] |FALSE | FALSE |
|[4,] |FALSE | FALSE |
|[5,] |FALSE | FALSE |
|... | ... | ... |
请注意,当我尝试 apply(working_data[933265:933266,], 1, my_function)
和 apply(working_data[933267:933268,], 1, my_function)
时,我得到了正确的结果!
所以它只为那个时间间隔返回 NA:apply(working_data[933266:933267,], 1, my_function)
我似乎不明白为什么!
另请注意,当 运行 一个 for 循环时,我 总是 得到正确的结果。
对此是否有任何理论解释(希望不需要提供可重现的示例。我的代码太深了)?
提前致谢
所以我解决了。问题是数据集中的一个值有一个尾随空格,并被传递给函数的参数之一。
当我单独(或通过 for 循环)应用该函数时,R 似乎自动处理了尾随空格并忽略了它。
此外,当从包含尾随空格的值(在我的例子中是第 933267 行)启动 apply() 函数时,apply() 不会检测到它,也不会抛出 NA 或错误,只会继续通常..这解释了为什么我用 apply(working_data[933267:933268,], 1, my_function)
得到干净的结果
但是,当具有尾随空格的值位于值范围的中间时(即不是第一个值),该函数将显示上述行为,并将 return 那些令人困惑的 NA。这解释了 apply(working_data[933266:933267,], 1, my_function)
中的不良结果
我希望它更一致; apply() 应该抛出 NA,即使第一个值中有尾随空格(即当我调用 apply(working_data[933267:933268,], 1, my_function)
时)。如果这样做,我会更早发现这一点。
见过这种行为吗?为什么?
我先总结一下我的问题,然后再澄清一下: 我有一个有效的函数“my_function()”。当我单独使用它时,它总是有效。 当我在其上使用 apply() 时,有时会得到错误的输出。示例:
apply(working_data[933266:933267,], 1, my_function)
让我得到不需要的 NA。
apply(working_data[933265:933266,], 1, my_function)
工作正常。
apply(working_data[933267:933268,], 1, my_function)
工作正常。
为什么 apply() 会这样?
我会澄清更多:
我有一个工作正常的函数,它 returns 对我来说是一个命名的逻辑向量。
我将给出一个输出示例:
my_function(working_data[933267,])
320170356871 174173601732 172156573581 320004381381 320210363581 ... FALSE FALSE FALSE FALSE FALSE ...
my_function(working_data[933266,])
320170356871 174173601732 172156573581 320004381381 320210363581 ... FALSE FALSE FALSE FALSE FALSE ...
好的,这是正确的(没有 NA,并且两个示例之间的输出不同,我检查过,不要被那些重复的 FALSE 骗了你)。
现在我想将它应用于数据框的行。每当我这样做时,它都会工作一段时间,然后突然开始到处返回 NAs 并且永远! (请注意,我将使用与上面相同的索引):
apply(working_data[933266:933267,], 1, my_function)
| |933266 | 933267|
|-----|-------|--------|
|[1,] |FALSE | NA |
|[2,] |FALSE | NA |
|[3,] |FALSE | NA |
|[4,] |FALSE | NA |
|[5,] |FALSE | NA |
|... | ... | ... |
这是我看到的。事实上,我得到的是 933266 左边的所有内容(即从 1 到 933266)都是正确的,而 933267 右边的所有内容都是 NA。
预期的输出是这样的:
| |933266 | 933267|
|-----|-------|--------|
|[1,] |FALSE | FALSE |
|[2,] |FALSE | FALSE |
|[3,] |FALSE | FALSE |
|[4,] |FALSE | FALSE |
|[5,] |FALSE | FALSE |
|... | ... | ... |
请注意,当我尝试 apply(working_data[933265:933266,], 1, my_function)
和 apply(working_data[933267:933268,], 1, my_function)
时,我得到了正确的结果!
所以它只为那个时间间隔返回 NA:apply(working_data[933266:933267,], 1, my_function)
我似乎不明白为什么!
另请注意,当 运行 一个 for 循环时,我 总是 得到正确的结果。
对此是否有任何理论解释(希望不需要提供可重现的示例。我的代码太深了)?
提前致谢
所以我解决了。问题是数据集中的一个值有一个尾随空格,并被传递给函数的参数之一。
当我单独(或通过 for 循环)应用该函数时,R 似乎自动处理了尾随空格并忽略了它。
此外,当从包含尾随空格的值(在我的例子中是第 933267 行)启动 apply() 函数时,apply() 不会检测到它,也不会抛出 NA 或错误,只会继续通常..这解释了为什么我用 apply(working_data[933267:933268,], 1, my_function)
但是,当具有尾随空格的值位于值范围的中间时(即不是第一个值),该函数将显示上述行为,并将 return 那些令人困惑的 NA。这解释了 apply(working_data[933266:933267,], 1, my_function)
我希望它更一致; apply() 应该抛出 NA,即使第一个值中有尾随空格(即当我调用 apply(working_data[933267:933268,], 1, my_function)
时)。如果这样做,我会更早发现这一点。