如何重塑dataframe并进行计数

如何重塑dataframe并进行计数,r,dataframe,R,Dataframe,我有一个这样的数据帧 ID A1 A2 A3 A4 A5 A6 A7 1 1 1 0 0 0 0 0 2 2 1 0 5 4 4 1 我想用频率计数来重塑并获得新的数据帧 ID Type Count 1 A1 1 2 A1 2 2 A2 1 2 A3 0 2 A4 5 2 A5 4 2 A6 4 2 A7 1

我有一个这样的数据帧

 ID     A1 A2 A3 A4  A5 A6 A7
1       1  1  0  0   0  0  0
2       2  1  0  5   4  4  1
我想用频率计数来重塑并获得新的数据帧

ID  Type  Count  
1    A1     1
2    A1     2
2    A2     1
2    A3     0 
2    A4     5
2    A5     4
2    A6     4
2    A7     1

我正在尝试转置,但它会生成2列7行。

我们可以
将数据收集为长格式,并保留非零值

library(dplyr)
df %>%
  tidyr::gather(key, value, -ID) %>%
  filter(value != 0)

#     ID key   value
#  <int> <chr> <int>
#1     1 A1        1
#2     1 A2        1
#3     2 A1        2
#4     2 A2        1
#5     2 A4        5
#6     2 A5        4
#7     2 A6        4
#8     2 A7        1
数据

df <- structure(list(ID = 1:2, A1 = 1:2, A2 = c(1L, 1L), A3 = c(0L, 
0L), A4 = c(0L, 5L), A5 = c(0L, 4L), A6 = c(0L, 4L), A7 = 0:1), class = 
"data.frame", row.names = c(NA, -2L))

df重塑数据的一种方法是使用包
重塑2

df_long <- reshape2::melt(df, id.vars = "ID")
df_long <- df_long[df_long$value != 0, ]
row.names(df_long) <- NULL

df_long
#  ID variable value
#1  1       A1     1
#2  2       A1     2
#3  1       A2     1
#4  2       A2     1
#5  2       A4     5
#6  2       A5     4
#7  2       A6     4
#8  2       A7     1

df_long这里是另一个利用R基的
堆栈的想法,即

subset(transform(stack(df[-1]), ID = rep(df$ID, (ncol(df) - 1))), values != 0)

#   values ind ID
#1       1  A1  1
#2       2  A1  2
#3       1  A2  1
#4       1  A2  2
#8       5  A4  2
#10      4  A5  2
#12      4  A6  2
#14      1  A7  2

transpose
是一种矩阵操作,它将行翻转为列,将列翻转为行。尽管类似,data.frames是表格形式,支持每列不同的数据类型(字符、数字、逻辑),而矩阵是“数学”的,严格来说是单一数据类型。为什么结果中没有
1 A2 1
?A1-A7是类型,ID是象限,所以每个象限的计数和类型都不同。
subset(transform(stack(df[-1]), ID = rep(df$ID, (ncol(df) - 1))), values != 0)

#   values ind ID
#1       1  A1  1
#2       2  A1  2
#3       1  A2  1
#4       1  A2  2
#8       5  A4  2
#10      4  A5  2
#12      4  A6  2
#14      1  A7  2