当使用连续变量时,从表函数创建一个适当的表

  • 本文关键字:一个 创建 函数 变量 连续 r
  • 更新时间 :
  • 英文 :


我有以下数据:

df <- structure(list(ID = c(1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 
2, 2), year = c(2001, 2002, 2003, 2001, 2002, 2003, 2001, 2002, 
2003, 2001, 2002, 2003, 2001, 2002, 2003), Type = c("A", "A", 
"A", "B", "B", "B", "A", "A", "A", "B", "B", "B", "C", "C", "C"
), Subtype = c(2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2), 
Value = c(0.480513615083894, 0.909788893002047, 0.685141970365005, 
0.138835747632889, 0.899508237239289, 0.535632890739584, 
0.0712054637209442, 0.655905506366812, 0.694753916517691, 
0.469249523993816, 0.295044859429007, 0.209906890342936, 
0.193574644156237, 0.0715219759792846, 0.626529278499682)), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -15L))
df <- setDT(df)[,mVal:=mean(Value), by=Type]
table(df$mVal, df$Type)
A B C
0.297208632878401 0 0 3
0.424696358229587 0 6 0
0.582884894176066 6 0 0

我真的很喜欢这个表提供的信息,所以我想知道是否有一种简单的方法将这个表转换成更合适的格式,如下所示:

所需输出:

mVal              N Type
0.297208632878401 3 C
0.424696358229587 6 B
0.582884894176066 6 A

我们可以直接从table对象转换为data.frame,返回一个长数据帧和subset,其中Freq不为0

out <- subset(as.data.frame(table(df$mVal, df$Type)), Freq != 0)
names(out) <- c("mVal", "Type", "N")

与产出

> out
mVal Type N
3 0.582884894176065    A 6
5 0.424696358229587    B 6
7 0.297208632878401    C 3

由于对象是tibble,我们也可以使用tidyverse解决方案直接获得长格式,而不是做table,然后重塑

library(dplyr)
df %>% 
count(mVal, Type, name = "N")
mVal   Type     N
<num> <char> <int>
1: 0.2972086      C     3
2: 0.4246964      B     6
3: 0.5828849      A     6

最新更新