在R中更改数据框对象结构

时间:2018-11-14 12:34:23

标签: r dataframe

我在 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. 对于$1中的每个唯一值,新数据框中仅一行。因此,对于此样本数据,新数据框应具有3行(唯一的4,12,13)。

  2. $2表示新数据帧的列号,其中值(新列号)的频率将被填充。例如,对于 $1的值4、5重复4次。因此,在新数据框中,第一行的第5列应具有值4。

  3. 所有其他列值为零。

此数据的示例输出如下:

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中做到这一点?预先感谢!

2 个答案:

答案 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()

enter image description here

数据

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))
}