在'$〈-.data.frame'('*tmp*')中出现错误:替换为1行,数据为0

vyswwuz2  于 2023-01-15  发布在  其他
关注(0)|答案(2)|浏览(3006)

我正在子集化一组 Dataframe ,每个 Dataframe 将被子集化成几个较小的 Dataframe 。有些将产生空 Dataframe ,并给出一个错误,如标题。
我的问题:如果我在R console中运行脚本,脚本将被执行,即使有错误消息,也会生成新的 Dataframe 。但如果我在R studio中使用"source"或尝试将脚本放在函数中或使用for循环,脚本将停止运行,只显示错误消息。
有办法吗?谢谢!

lawou6xi

lawou6xi1#

您没有正确地设置数据框的子集,我建议您修复子集设置,而不是试图忽略错误以下是一个示例,说明创建新列的错误方法会导致您获得的错误:

df <- data.frame(a = -(1:5), b = 1:5)
df$c[which(df$a>0)] <- 7
#Error in `$<-.data.frame`(`*tmp*`, "c", value = numeric(0)) : 
#  replacement has 0 rows, data has 5

相反,第二个语句应该是:

rm(df)
df <- data.frame(a = -(1:5), b = 1:5)
df$c[df$a>0] <- 7
df
#    a b  c
# 1 -1 1 NA
# 2 -2 2 NA
# 3 -3 3 NA
# 4 -4 4 NA
# 5 -5 5 NA

为了回答你关于捕捉脚本中的错误的问题,R有一组try/catch函数:

rm(df)
df <- data.frame(a = -(1:5), b = 1:5)
tryCatch({
  df <- data.frame(a = -(1:5), b = 1:5)
  df$c[which(df$a>0)] <- 7
}, error = function(e)print(e)  , warning = function(w) )

您可以在R文档和Hadley威克姆的 Advanced R 在线手册中获得更多有关如何使用此函数的示例:http://adv-r.had.co.nz/Exceptions-Debugging.html

owfi6suc

owfi6suc2#

我在使用带分组的likert包时遇到了这个错误。

plot(likert(KnowledgeAndInterest[,c(1:2)], grouping = KnowledgeAndInterest[,3]), legend.position="right") +
  scale_fill_manual(values = brewer.pal(n=5,"RdYlBu"), breaks = c("None at all", "A little", "A moderate amount", "A lot", "A very lot"))  +
  guides(fill = guide_legend(title=""))

KnowledgeAndInterest是一个只包含3列数据的数据框,它是专门为likert创建的,我花了一段时间才发现错误是由于第3列(分组列)中的不完整数据(NA值)造成的,在调用likert之前,将数据框简化为只使用完整的案例,从而解决了这个问题:

KnowledgeAndInterest <- KnowledgeAndInterest[complete.cases(KnowledgeAndInterest), ]

我希望这对任何有类似问题的人都有帮助。

相关问题