我有以下数据:
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