如何重塑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