gpt4 book ai didi

没有名称的 rbind data.frames

转载 作者:行者123 更新时间:2023-12-03 21:29:46 26 4
gpt4 key购买 nike

我想弄清楚为什么 rbind加入没有名称的 data.frames 时,函数无法按预期工作。
这是我的测试:

test <- data.frame(
id=rep(c("a","b"),each=3),
time=rep(1:3,2),
black=1:6,
white=1:6,
stringsAsFactors=FALSE
)

# take some subsets with different names
pt1 <- test[,c(1,2,3)]
pt2 <- test[,c(1,2,4)]

# method 1 - rename to same names - works
names(pt2) <- names(pt1)
rbind(pt1,pt2)

# method 2 - works - even with duplicate names
names(pt1) <- letters[c(1,1,1)]
names(pt2) <- letters[c(1,1,1)]
rbind(pt1,pt2)

# method 3 - works - with a vector of NA's as names
names(pt1) <- rep(NA,ncol(pt1))
names(pt2) <- rep(NA,ncol(pt2))
rbind(pt1,pt2)

# method 4 - but... does not work without names at all?
pt1 <- unname(pt1)
pt2 <- unname(pt2)
rbind(pt1,pt2)

这对我来说似乎有点奇怪。我是否缺少一个很好的理由为什么这不应该开箱即用?

编辑以获取更多信息

使用@JoshO'Brien 对 debug 的建议,我可以确定在此期间发生的错误 if rbind.data.frame的声明部分功能
if (is.null(pi) || is.na(jj <- pi[[j]]))

(此处代码的在线版本: http://svn.r-project.org/R/trunk/src/library/base/R/dataframe.R 起始于:“### 这里是 rbind 和 cbind 的方法。”)

单步执行程序, pi的值此时似乎尚未设置,因此程序尝试索引内置常量 pi喜欢 pi[[3]]和错误。

据我所知,内部 pi由于此较早的行,其中 clabs 似乎未设置对象已初始化为 NULL :
if (is.null(clabs)) clabs <- names(xi) else { #pi gets set here

我正在纠结试图解决这个问题,但会随着它的出现而更新。

最佳答案

因为 unname() & 明确指定 NA 作为列标题不是相同的操作。当列名都是 NA 时,则是 rbind()是可能的。自 rbind()采用数据框的名称/列名,结果不匹配,因此 rbind()失败。

下面是一些代码来帮助理解我的意思:

> c1 <- c(1,2,3)
> c2 <- c('A','B','C')
> df1 <- data.frame(c1,c2)
> df1
c1 c2
1 1 A
2 2 B
3 3 C
> df2 <- data.frame(c1,c2) # df1 & df2 are identical
>
> #Let's perform unname on one data frame &
> #replacement with NA on the other
>
> unname(df1)
NA NA
1 1 A
2 2 B
3 3 C
> tem1 <- names(unname(df1))
> tem1
NULL
>
> #Please note above that the column headers though showing as NA are null
>
> names(df2) <- rep(NA,ncol(df2))
> df2
NA NA
1 1 A
2 2 B
3 3 C
> tem2 <- names(df2)
> tem2
[1] NA NA
>
> #Though unname(df1) & df2 look identical, they aren't
> #Also note difference in tem1 & tem2
>
> identical(unname(df1),df2)
[1] FALSE
>

我希望这有帮助。名称显示为 NA每个,但两个操作是不同的。

因此,两个数据框的列标题被替换为 NA可以是“rbound”,但没有任何列标题的两个数据框(使用 unname() 实现)不能。

关于没有名称的 rbind data.frames,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13599197/

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