the*_*ail 7 r names dataframe rbind
我试图弄清楚为什么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)
Run Code Online (Sandbox Code Playgroud)
这对我来说有点奇怪.我错过了一个很好的理由,为什么这不应该开箱即用?
编辑其他信息
使用@ JoshO'Brien的建议debug,我可以if在rbind.data.frame函数的这个语句部分中识别出错误
if (is.null(pi) || is.na(jj <- pi[[j]]))
Run Code Online (Sandbox Code Playgroud)
(此处代码的在线版本: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
Run Code Online (Sandbox Code Playgroud)
我正在纠结中试图解决这个问题,但会随着它的结合而更新.
因为unname()&明确地将NA指定为列标题不是相同的操作.当列名都是NA时,则a 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
>
Run Code Online (Sandbox Code Playgroud)
我希望这有帮助.名称显示为NA每个,但两个操作是不同的.
因此,替换为其列标题的两个数据帧NA可以是"rbound",但是没有任何列标题(使用实现unname())的两个数据帧不能.
| 归档时间: |
|
| 查看次数: |
12272 次 |
| 最近记录: |