繁体   English   中英

无法使用列名和行名填充数据框

[英]unable to fill a data frame using column names and row names

我有这样的数据框“ x”:

        meme   webId  timeStamp
        2501   68814  281322.1 
        2501    2679  305813.0
        2501     948  306025.6 

我想将“ meme”和“ webId”用作行和列名称,并将timeStamp用作“ mat”数据框中的元素。 我这样写:

cols<-unique(x[,"webId"])

rows<-unique(x[,"meme"])

mat<-data.frame(matrix(data=9999999,nrow=length(rows),ncol=length(cols)))

colnames(mat)<-c(cols)

rownames(mat)<-c(rows)

for(i in 1:length(x))
        mat[rownames(mat)==x[i,"meme"],colnames(mat)==x[i,"webId"]]<-x[i,"timeStamp"]

但是什么都没有改变。 问题是什么? 请帮我!!!

在for循环中,您似乎要遍历x中的所有行,并将所有值一张一张地填充到mat中。 相反,您仅迭代3行。 length(x)给出列数而不是行数。 这是遍历所有行的正确代码:

for(i in 1:nrow(x))
        mat[rownames(mat)==x[i,"meme"],colnames(mat)==x[i,"webId"]]<-x[i,"timeStamp"]

我怀疑x数据框包含的值比您发布的值更多。 在您的示例中,行数等于列数,这就是为什么评论者找不到问题。 在您的示例中,问题并不明显。

你可以通过使用获得“行/列”指数matchcbind它并指定“时间戳”元素在“垫子”索引指定的位置。

 mat[cbind(match(x$meme, rownames(mat)),
             match(x$webId, colnames(mat)))] <- x$timeStamp

 mat
 #     428 2679 68814 948
 #2505  13   11     8   3
 #2510  16    6    14   1
 #2501   7    4     5  10
 #2508  12    2     9  15

检查for循环的结果

 for(i in 1:nrow(x))
    mat1[rownames(mat1)==x[i,"meme"],
             colnames(mat1)==x[i,"webId"]]<-x[i,"timeStamp"]

 mat1
 #     428 2679 68814 948
 #2505  13   11     8   3
 #2510  16    6    14   1
 #2501   7    4     5  10
 #2508  12    2     9  15

基准测试

set.seed(21)
x1 <- data.frame(meme= rep(sample(1000), each=200), 
   webId= rep(sample(35000, 200, replace=FALSE), 1000), 
      timeStamp=rnorm(1000*200))
set.seed(324)
mat2 <- matrix(, 1000, 200, 
    dimnames=list(sample(unique(x1$meme)),sample(unique(x1$webId))))
mat3 <- mat2

system.time({
  mat2[cbind(match(x1$meme, rownames(mat2)),
         match(x1$webId, colnames(mat2)))] <- x1$timeStamp
     })
 # user  system elapsed 
 #  0.181   0.001   0.181 

system.time({

 for(i in 1:nrow(x1))
    mat3[rownames(mat3)==x1[i,"meme"],
            colnames(mat3)==x1[i,"webId"]]<-x1[i,"timeStamp"]

 })
# user  system elapsed 
#172.588  10.445 183.062 

 identical(mat2, mat3)
 #[1] TRUE

数据

set.seed(24)
x <- data.frame(meme=rep(c(2501, 2505, 2508, 2510), each=4),
    webId= rep(c(68814, 2679, 948, 428), 4), timeStamp= sample(16))
set.seed(33)
mat <- matrix(, 4, 4, dimnames=list(sample(unique(x$meme)),
    sample(unique(x$webId))))
mat1 <- mat

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM