我在 R 中有一个数据框对象,其示例如下:
4 5
4 5
4 5
4 6
4 10
4 10
4 10
4 10
4 9
4 9
4 10
4 10
4 6
4 5
12 3
12 4
12 4
12 4
13 8
13 10
13 9
13 12
13 11
13 13
13 12
13 11
我要从此数据框中创建一个新的 20 列的数据框(以创建热图),如下所示:
对于$1
中的每个唯一值,新数据框中仅一行。因此,对于此样本数据,新数据框应具有3行(唯一的4,12,13)。
$2
表示新数据帧的列号,其中值(新列号)的频率将被填充。例如,对于
$1
的值4、5重复4次。因此,在新数据框中,第一行的第5列应具有值4。
所有其他列值为零。
此数据的示例输出如下:
0 0 0 0 4 2 0 0 2 6 0 0 0 0 0 0 0 0 0 0
0 0 1 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1 1 1 2 2 1 0 0 0 0 0 0 0
我们如何在R中做到这一点?预先感谢!
答案 0 :(得分:1)
这里是使用table
的选项。 “技巧”是将第二列转换为具有适当水平的因子。
df1$X2 <- factor(df1$X2, levels = 1:20)
out <- as.data.frame(table(df1))
这是一种可以绘制结果的方法。
library(ggplot2)
ggplot(out, aes(X2, X1, fill = Freq)) + geom_tile() + coord_fixed()
数据
df1 <- structure(list(X1 = c(4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L,
4L, 4L, 4L, 4L, 12L, 12L, 12L, 12L, 13L, 13L, 13L, 13L, 13L,
13L, 13L, 13L), X2 = structure(c(5L, 5L, 5L, 6L, 10L, 10L, 10L,
10L, 9L, 9L, 10L, 10L, 6L, 5L, 3L, 4L, 4L, 4L, 8L, 10L, 9L, 12L,
11L, 13L, 12L, 11L), .Label = c("1", "2", "3", "4", "5", "6",
"7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17",
"18", "19", "20"), class = "factor")), .Names = c("X1", "X2"), row.names = c(NA,
-26L), class = "data.frame")
答案 1 :(得分:0)
在同事的帮助下:
heatmap_func <-function(df){
levels<-unique(df[,1])
result<-matrix(0, length(levels), 20)
for(i in 1:nrow(result)){
occ<-as.data.frame(table(df[df[,1]==levels[i],2]),stringsAsFactors = F)
for(j in 1:nrow(occ)){
result[i,as.numeric(occ[j,1])]<-as.numeric(occ[j,2])
}
}
return(as.data.frame(result))
}