有没有办法检查数据框是否为空,如果是则添加 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>
答案是使用 if
和 else
,而不是 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{}
语句进行比较,后者的结果元素取决于输入 {}
.
的任何表达式
例如,我有一个内部没有任何内容的数据框,但我需要它来 运行 完整代码,因为它通常期望有数据。我试过了,但没用
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>
答案是使用 if
和 else
,而不是 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{}
语句进行比较,后者的结果元素取决于输入 {}
.