data.frame(...,check.names = FALSE)中的错误:参数意味着行数不同:0,1

时间:2018-03-17 06:54:17

标签: r

我只想将表恢复到原始结构。但是,它有一个错误,我不知道如何调试它。

rm(list=ls())
Mytable<-function(mytable){
    rows<-dim(mytable)[1]
    cols<-dim(mytable)[2]
    datatable<-NULL
    for(i in 1:rows){
        for(j in 1:mytable$N[i])
        {
            rowdata=mytable[i,c(1:2)]
            datatable=cbind(datatable,rowdata)
        }
    }
    row.names(datatable)<-c(1:dim(datatable)[1])
    return(datatable)
}
sex<-rep(c('M','F'),each=4)
grade<-rep(c('B','C','D','E'),2)
number<-c(2,11,12,5,2,13,10,3)
table<-data.frame(S=sex,G=grade,N=number,stringsAsFactors=F)
mydata<-Mytable(table)

3 个答案:

答案 0 :(得分:0)

我不确定你在使用你的函数做什么(更具描述性的名称会有所帮助),但我想你应该使用rbind而不是cbind,因为它似乎是绑定行而不是列。< / p>

答案 1 :(得分:0)

我现在通过滥用cbind来判断我错在哪里。正确的代码如下。

rm(list=ls())
Mytable<-function(mytable){
rows<-dim(mytable)[1]
cols<-dim(mytable)[2]
datatable<-NULL
for(i in 1:rows){
    for(j in 1:mytable$N[i])
    {
        rowdata=mytable[i,c(1:2)]
        datatable=cbind(datatable,rowdata)
    }
}
row.names(datatable)<-c(1:dim(datatable)[1])
return(datatable)
}
sex<-rep(c('M','F'),each=4)
grade<-rep(c('B','C','D','E'),2)
number<-c(2,11,12,5,2,13,10,3)
table<-data.frame(S=sex,G=grade,N=number,stringsAsFactors=F)
mydata<-Mytable(table)

答案 2 :(得分:0)

使用tidyr::completedplyr可以实现一个解决方案,重复列N中提到的行数。解决方案如下:

    library(dplyr)
    library(tidyr)

    table %>% group_by(S,G) %>%
      complete(S,G,N = seq(N)) %>%
      as.data.frame()

# S G  N
# 1  F B  1
# 2  F B  2
# 3  F C  1
# 4  F C  2
# 5  F C  3
# 6  F C  4
# 7  F C  5
# 8  F C  6
# 9  F C  7
#
#.....49 more rows

数据

sex<-rep(c('M','F'),each=4)
grade<-rep(c('B','C','D','E'),2)
number<-c(2,11,12,5,2,13,10,3)
table<-data.frame(S=sex,G=grade,N=number,stringsAsFactors=F)