我有一个带分类值的数据框
Names Dis Del
A 0-2 0-2
A 2-4 0-2
A 6-8 6-8
B 8-10 8-10
C 10+ 10+
我想要的是根据此数据输出的计数数
0-2 2-4 6-8 8-10 10+
0-2 1
2-4 1
6-8 1
8-10 1
10+ 1
我还想导出这个数据框中创建的数据。
答案 0 :(得分:2)
来自@mtoto&的评论@jogo:
table(mydf[-1])
或:
xtabs(data=mydf, ~ Dis+Del)
两者都给:
Del
Dis 0-2 10+ 6-8 8-10
0-2 1 0 0 0
10+ 0 1 0 0
2-4 1 0 0 0
6-8 0 0 1 0
8-10 0 0 0 1
如果您想以正确的顺序(10+
作为最后一个)获得级别:
mydf$Dis <- factor(mydf$Dis, levels = c("0-2","2-4","6-8","8-10","10+"))
mydf$Del <- factor(mydf$Del, levels = c("0-2","6-8","8-10","10+"))
现在你得到:
Del
Dis 0-2 6-8 8-10 10+
0-2 1 0 0 0
2-4 1 0 0 0
6-8 0 1 0 0
8-10 0 0 1 0
10+ 0 0 0 1
使用过的数据:
mydf <- read.table(text="Names Dis Del
A 0-2 0-2
A 2-4 0-2
A 6-8 6-8
B 8-10 8-10
C 10+ 10+", header=TRUE)
答案 1 :(得分:0)
我认为您正在寻找dcast
包中的reshape2
功能。
df <- data.frame(Dis = c("0-2","2-4", "6-8", "8-10", "10+"),
Del = c("0-2", "0-2", "6-8", "8-10", "10+"))
将要重塑的列转换为因子。
df$Dis <- as.factor(df$Dis)
df$Del <- as.factor(df$Del)
添加count columnt以减少:
df$counts <- 1
然后应用dcast
功能。我们使用两个命名列来设置新矩阵的cols / rows。 fun.aggregate
确保如果您有多次出现相同的组合,那么您将获得出现次数。
如果需要二进制0/1,则将其设置为max
wide_df <- dcast(df,
Dis ~ Del,
value.var = "counts",
fun.aggregate = sum)
结果如下:
print(wide_df)
Dis 0-2 10+ 6-8 8-10
1 0-2 1 0 0 0
2 10+ 0 1 0 0
3 2-4 1 0 0 0
4 6-8 0 0 1 0
5 8-10 0 0 0 1
要获得与问题相同的顺序,您可以按照您想要的顺序设置第一步中的因子。