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

时间:2015-05-24 12:54:16

标签: r

我的数据框“x”如下:

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

我想在“mat”数据框中使用“meme”和“webId”作为行名和列名以及timeStamp作为元素。我写了这个:

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"]

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

2 个答案:

答案 0 :(得分:0)

在for循环中,似乎你的意思是迭代x中的所有行,并将所有值逐个填充到mat中。相反,您只迭代3行。 var pieData = []; i = 0; $.each(obj, function(key, item) { pieData[i] = {}; // added line pieData[i].value = item.total + " - " + item.d_name; pieData[i].color = getRandomColor(); pieData[i].highlight = getRandomColor(); i++; }); 给出的列数不是行数。这是迭代所有行的正确代码:

length(x)

我怀疑x数据框包含的值多于您发布的值。在您的示例中,行数等于列数,这就是评论者无法找到问题的原因。问题在你的例子中并不明显。

答案 1 :(得分:0)

您可以使用matchcbind获取'row / column'索引,并将'timeStamp'元素分配给'mat'中索引指定的位置。

 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