2015-10-13 111 views
1

我的问题与this类似,但我没有一个常数标准。根据其他变量计数数据帧中的变量

我的数据帧是这样的:

> head(df) 
    id run corr rank 
1 a v1 0.2 1 
2 a v2 0.3 2 
3 a v3 0.6 3 
4 b v2 0.1 1 
5 b v1 0.3 2 
6 b v3 0.4 3 

> dput(df) 
structure(list(id = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 
3L, 4L, 4L, 4L), .Label = c("a", "b", "c", "d"), class = "factor"), 
    run = structure(c(1L, 2L, 3L, 2L, 1L, 3L, 2L, 1L, 3L, 1L, 
    2L, 3L), .Label = c(" v1", " v2", " v3"), class = "factor"), 
    corr = c(0.2, 0.3, 0.6, 0.1, 0.3, 0.4, 0.1, 0.2, 0.3, 0.3, 
    0.4, 0.7), rank = c(1L, 2L, 3L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 
    2L, 3L)), .Names = c("id", "run", "corr", "rank"), class = "data.frame", 
row.names = c(NA, -12L)) 

现在,我要算多久V1(分别为v2和v3)等于1的排名(分别为2和3)。输出应该是这样的:

1 2 3 
v1 2 2 0 
v2 2 2 0 
v3 0 0 4 
+0

我不知道这个问题以前有多少次被问过?你有没有做搜索? –

+0

@BonddedDust,有时你只是不知道什么是正确的关键字寻找...... – Iris

回答

2

您可以使用table

table(df$run, df$rank) 

     1 2 3 
    v1 2 2 0 
    v2 2 2 0 
    v3 0 0 4 
1

使用table

> table(df[, c("run", "rank")]) 
    rank 
run 1 2 3 
    v1 2 2 0 
    v2 2 2 0 
    v3 0 0 4 
3

dplyrtidyr方法:

library(dplyr) 
library(tidyr) 

df %>% 
    count(run, rank) %>% 
    spread(rank, n, fill = 0) 

# Source: local data frame [3 x 4] 
# 
#  run  1  2  3 
# (fctr) (int) (int) (int) 
# 1  v1  2  2  0 
# 2  v2  2  2  0 
# 3  v3  0  0  4