这是非常正确的,但我似乎无法在R中做到这一点,主要是因为我对语言的接触受到严重限制
所以我有一个表格,它是一个奇点矩阵,它的形式是:
rownames C1 C2 C3 C4
R1 0 1 0 1
R2 0 1 1 0
R3 1 0 1 0
R4 0 0 0 0所以我想用一种很好的方式来画这个图,我发现的一种方法是,如果我改变矩阵,在数据中显示行名,
因此,在有'1‘的表中,我想用相应的行名替换它
所以我想做的是:
rownames C1 C2 C3 C4
R1 0 R1 0 R1
R2 0 R2 R2 0
R3 R3 0 R3 0
R4 0 0 0 0我意识到这是非常简单的事情,但我发现R语言有点难理解。
提前感谢
发布于 2015-02-25 17:24:29
如果rownames是一列,则可以:
t(apply(d,1,function(rw) {rw[rw==1] <- rw[1]; rw}))它将逐行扫描数据帧,并将1替换为来自第一列的相应值。
d是初始数据集:
d <- structure(list(rownames = structure(1:4, .Label = c("R1", "R2",
"R3", "R4"), class = "factor"), C1 = c(0L, 0L, 3L, 0L), C2 = c(1L,
2L, 0L, 0L), C3 = c(0L, 2L, 3L, 0L), C4 = c(1L, 0L, 0L, 0L)), .Names = c("rownames",
"C1", "C2", "C3", "C4"), row.names = c(NA, -4L), class = "data.frame")发布于 2015-02-25 17:04:39
这里有一个可能的矢量化解决方案
indx <- which(df == 1, arr.ind = TRUE)
df[indx[order(indx[, 1]), ]] <- rep(row.names(df), rowSums(df))
# C1 C2 C3 C4
# R1 0 R1 0 R1
# R2 0 R2 R2 0
# R3 R3 0 R3 0
# R4 0 0 0 0数据
df <- structure(list(C1 = c(0L, 0L, 1L, 0L), C2 = c(1L, 1L, 0L, 0L),
C3 = c(0L, 1L, 1L, 0L), C4 = c(1L, 0L, 0L, 0L)), .Names = c("C1",
"C2", "C3", "C4"), class = "data.frame", row.names = c("R1",
"R2", "R3", "R4"))发布于 2015-02-25 17:32:17
df<-structure(list(C1 = c(0L, 0L, 1L, 0L), C2 = c(1L, 1L, 0L, 0L),
C3 = c(0L, 1L, 1L, 0L), C4 = c(1L, 0L, 0L, 0L)), .Names = c("C1",
"C2", "C3", "C4"), row.names = c("R1", "R2", "R3", "R4"), class = "data.frame")
for(i in 1:ncol(df)){
df[df[,i]==1,i]<-row.names(df)[which(df[,i]==1)]
}
> df
C1 C2 C3 C4
R1 0 R1 0 R1
R2 0 R2 R2 0
R3 R3 0 R3 0
R4 0 0 0 0
> https://stackoverflow.com/questions/28725003
复制相似问题