有没有办法检查数据框是否为空,如果是则添加 NA 行?

Is there a way to check if dataframe is empty and if so to add a NA row?

例如,我有一个内部没有任何内容的数据框,但我需要它来 运行 完整代码,因为它通常期望有数据。我试过了,但没用

ifelse(dim(df_empty)[1]==0,rbind(Shots1B_empty,NA))

我们可能需要 if/else 而不是 ifelse - ifelse 要求所有参数的长度相同,当我们 rbind[ 时显然不是这种情况=15=]

Shots1B_empty <- if(nrow(df_empty) == 0)  rbind(Shots1B_empty, NA)

也许是这样的:

df_empty <- data.frame(x=integer(0), y = numeric(0), a = character(0))

if(nrow(df_empty) == 0){
  df_empty <- rbind(df_empty, data.frame(x=NA, y=NA, a=NA))
}
df_empty
#   x  y  a
#1 NA NA NA

简单的问题,OP,但实际上很有趣。您代码的所有元素都应该有效,但问题是当您按原样 运行 时,它将 return 一个列表,而不是一个数据框。让我举个例子给你看:

growing_df <- data.frame(
  A=rep(1, 3),
  B=1:3,
  c=LETTERS[4:6])

df_empty <- data.frame()

如果我们按照您所写的进行评估,您将得到:

df <- ifelse(dim(df_empty)[1]==0, rbind(growing_df, NA))

df 产生一个列表:

> class(df)
[1] "list"
> df
[[1]]
[1]  1  1  1 NA

代码“有效”,但 df 的结果 class 是错误的。这很奇怪,因为它有效:

> rbind(growing_df, NA)
   A  B    c
1  1  1    D
2  1  2    E
3  1  3    F
4 NA NA <NA>

答案是使用 ifelse,而不是 ifelse(),就像 @ak运行 在他们的回答中指出的那样。 原因如果你深入ifelse()documentation就会发现:

ifelse returns a value with the same shape as test which is filled with elements selected from either yes or no depending on whether the element of test is TRUE or FALSE.

由于dim(df_empty)[1]and/ornrow(df_empty)都是向量,所以结果会保存为列表。这就是 if {} 有效但 ifelse() 无效的原因。 rbind() 通常会产生一个数据帧,但是当用 ifelse() 分配时存储到 df 中的结果的 class 是根据测试元素而不是结果元素决定的。将其与 if{} 语句进行比较,后者的结果元素取决于输入 {}.

的任何表达式