我在for循环中运行tryCatch
语句时遇到问题。我想遍历数据帧(x
中的每一行,如果在获取列k1
中给定行的sqrt时出错,我希望sqrtd
等于{{ 1}},如果不是错误,则为sqrt值。
下面是我尝试过的代码,但是每一行的新列"NULL"
都有sqr
,但是只有第二行应该是"NULL"
,因为一个人不能使用{{ 1}}。
"NULL"
答案 0 :(得分:0)
JMisc的addCol
似乎在整个列的data.frame中添加了一个值(文档混淆地将其称为“常数”)。在您的代码中,您将在第一次迭代后用新值替换现有列。
您所遇到的解决方案是避免for
循环-实际上,data.frames实际上不应在循环内构建。而是使用R的向量化运算。如:
sqrt_or_null = function (x) {
tryCatch(sqrt(x), error = function (e) "NULL")
}
p = mutate(x, sqr = lapply(k1, sqrt_or_null))
但是,这将为您留下一个列表列,这是data.frame中的笨拙数据类型。原因是给定的非列表列只能包含单一类型的值,但是您的函数将根据操作是否成功返回不同类型:numeric
或{{ 1}}。
您可以投射结果:
character
...但是我建议考虑更好地表示失败值(例如p = mutate(x, sqr = as.character(lapply(k1, sqrt_or_null)))
),或者在执行此操作之前避免失败(例如,通过NA
无效行)。
您的代码还有一个问题:filter
的类型是k1
,而不是factor
。因此,对于每个值,它将失败。您将需要首先将因子值转换为数值,这需要两个步骤:转换为字符串,然后转换为数值:
numeric
答案 1 :(得分:0)
每个向量只能是一种类型(例如,数字,逻辑,字符)。如果尝试在向量分配中包括多个类型,则向量将被强制转换为可以处理输入的最广泛的类型。如果运行x$k1
,则应注意,结果向量是字符串的字符向量(即"3" "a" "3" "4" "5"
)。这是因为"a"
是一个字符串,因此整个向量x$k1
被强制转换为字符。取该向量中任何元素的平方根都会产生错误,因此sqrtd
总是被分配"NULL"
。