[英]How to reshape dataframe and take the count
我有这样的数据帧
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行。
我们可以将数据gather
到长格式并保持非零值。
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
或者使用data.table
library(data.table)
melt(setDT(df), id.vars = "ID")[value != 0, ]
数据
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))
一种重塑数据的方法是使用包reshape2
。
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
这是利用基础R的stack
另一个想法,即
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.