DPLYR

2017-10-25 9 views
1

と各列の数の範囲内のすべての値Iは、次のサンプルデータフレームを持って数える:このデータからDPLYR

df <- data.frame("Alpha" = c(NA, NA, 6, 5, 4, 6, 5, 3), "Beta" = c(3, 3, 4, 2, 6, NA, NA, NA), "Gamma" =c(6, 2, 3, 1, NA, NA, 5, 4)) 

を、私は、各列の0と6の間のすべての値のカウントを取得したいと思います。

result <- data.frame("value"=c(0, 1, 2, 3, 4, 5, 6), 
        "Alpha"=c(0, 0, 0, 1, 1, 2, 2), 
        "Beta"=c(0, 0, 1, 2, 1, 0, 1), 
        "Gamma"=c(0, 1, 1, 1, 1, 1, 1)) 

value  Alpha  Beta  Gamma 
    0   0  0   0 
    1   0  0   1 
    2   0  1   1 
    3   1  2   1 
    4   1  1   1 
    5   2  0   1 
    6   2  1   1   

私の最初の傾きがdplyrで明確な()関数をあらためて表明した。最終的な出力は次のようになりますので、データフレームは、0と6の間のすべての値が含まれていません。私は次のようなものを使うことを考えていました:

df.alpha <- df %>% distinct(Alpha) 
df.beta <- df %>% distinct(Beta) 
df.gamma <- df %>% distinct(Gamma) 

その後、私はそれらを一緒にバインドします。しかし、私は3つの問題に遭遇:

  • をコピーがたくさんありますし、ここに貼り付け(複数の列が私の本当のデータフレームである)
  • 結果は、結合が困難に同じ長さを、持っていません。
  • "0"は元のテーブルの値ではないため、結果にはカウントされません。

私は同様の質問をcounting a specific value in multiple columns at onceに見つけました。しかし、そのポストとは異なり、私がここにある問題は、「グループ化する」変数がないことです。

皆さんは、すべての列の整数の範囲内で値の数をどのように生成できるかについて提案はありますか?本当にありがとう!

答えて

1

たぶん、このような何か:

> df[] <- lapply(df,function(x) factor(x,levels = 0:6)) 
> data.frame(lapply(df,tabulate)) 
    Alpha Beta Gamma 
1  0 0  0 
2  0 0  1 
3  0 1  1 
4  1 2  1 
5  1 1  1 
6  2 0  1 
7  2 1  1 
1

ワンライナーに似joranの答えは、これはtabulate機能でtableを交換

values Alpha Beta Gamma 
0  0  0 0  0 
1  1  0 0  1 
2  2  0 1  1 
3  3  1 2  1 
4  4  1 1  1 
5  5  2 0  1 
6  6  2 1  1 

を返し

cbind.data.frame(values=0:6, sapply(df, function(x) table(factor(x, levels=0:6)))) 

ですがスピードアップする必要があります結果を簡素化することができます。

0

tidyverseともう一つのアイデア:

library(dplyr) 
library(purrr) 

df %>% 
    mutate_all(factor, levels = 0:6) %>% 
    map_dfc(~ c(table(.))) %>% 
    cbind(values = 0:6, .) 

結果:

values Alpha Beta Gamma 
1  0  0 0  0 
2  1  0 0  1 
3  2  0 1  1 
4  3  1 2  1 
5  4  1 1  1 
6  5  2 0  1 
7  6  2 1  1