gpt4 book ai didi

r - 将一个非空的 data.frame 与一个空的合并时的奇怪行为

转载 作者:行者123 更新时间:2023-12-03 14:35:55 24 4
gpt4 key购买 nike

我有一个非空数据框 df1

df1 <- structure(list(V1 = 1:4, V2 = 5:8), class = "data.frame", row.names = c(NA, 
-4L))

> df1
V1 V2
1 1 5
2 2 6
3 3 7
4 4 8
和两个空数据框 df2.adf2.b , IE。,
df2.a <- structure(list(V1 = integer(0), V2 = integer(0), V3 = integer(0), V4 = integer(0)), row.names = integer(0), class = "data.frame")


df2.b <- structure(list(V1 = NULL, V2 = NULL, V3 = NULL, V4 = NULL), row.names = c(NA, 0L), class = "data.frame")
哪里 df2.adf2.b看起来几乎没有区别(唯一的区别是使用 dput(df2.a)dput(df2.b) 时显示的)
> df2.a
[1] V1 V2 V3 V4
<0 rows> (or 0-length row.names)
> df2.b
[1] V1 V2 V3 V4
<0 rows> (or 0-length row.names)
但是,当我尝试合并时 df1df2.adf2.b ,奇怪的事情发生了
> merge(df1,df2.a,all = TRUE)
V1 V2 V3 V4
1 1 5 NA NA
2 2 6 NA NA
3 3 7 NA NA
4 4 8 NA NA

> merge(df1,df2.b,all = TRUE)
V1 V2 V4
1 1 5 NA
2 2 6 NA
3 3 7 NA
4 4 8 NA
如您所见, V3合并时被丢弃 df1df2.b ,而所需的应该类似于 merge(df1,df2.a,all = TRUE) 的输出.
有人可以解释一下吗?如果在使用 merge 时有解决此问题的解决方法,我们将不胜感激。在 df1df2.b .

最佳答案

这是一个复杂的问题。错误步骤发生在 this linebase::merge :

y <- y[c(m$yi, if (all.x) rep.int(1L, nxx), if (all.y) m$y.alone), 
-by.y, drop = FALSE]
当您通过 df2.by论据 merge ,这一行实际上产生了一个无效的数据框,你可以在浏览器中看到:
Browse[2]> y
#> V4
#> NA NULL
#> NA.1 <NA>
#> NA.2 <NA>
#> NA.3 <NA>
#> Warning message:
#> In format.data.frame(if (omit) x[seq_len(n0), , drop = FALSE] else x, :
#> corrupt data frame: columns will be truncated or padded with NAs
如果我们通过跟踪逻辑,我们可以看到我们可以通过调用在调试器之外重现错误:
df2.b[c(1, 1, 1, 1), -c(1:2), drop = FALSE]
#> V4
#> NA NULL
#> NA.1 <NA>
#> NA.2 <NA>
#> NA.3 <NA>
#> Warning message:
#> In format.data.frame(if (omit) x[seq_len(n0), , drop = FALSE] else x, :
#> corrupt data frame: columns will be truncated or padded with NAs
而对于 db2.a,我们没有遇到这个问题。 :
df2.a[c(1, 1, 1, 1), -c(1:2), drop = FALSE]
#> V3 V4
#> NA NA NA
#> NA.1 NA NA
#> NA.2 NA NA
#> NA.3 NA NA
那么这是为什么呢?即使 df2.adf2.b打印数据框时看起来相同,但它们并不相同。空的数字向量与 NULL 不太一样.主要区别(导致这里出现问题的那个)是索引一个空的数字向量会给你一个非零长度 NA值,而 NULL 给你一个 NULL值(value)。
df2.a$V1[1:4]
#> [1] NA NA NA NA

df2.b$V1[1:4]
#> NULL
所以我想这是预期的行为。问题是 R 允许 NULL作为一个数据框列。我很惊讶这种事情不会经常发生。

关于r - 将一个非空的 data.frame 与一个空的合并时的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64008827/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com