繁体   English   中英

如何重塑数据框并进行计数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM