[英]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数据框包含的值比您发布的值更多。 在您的示例中,行数等于列数,这就是为什么评论者找不到问题。 在您的示例中,问题并不明显。
你可以通过使用获得“行/列”指数match
, cbind
它并指定“时间戳”元素在“垫子”索引指定的位置。
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.