列名の変更: rename()

列名を変更するには、 rename() 関数が使えます。書式は、 rename("新しい列名" = 既存の列名) です。

下記の例では、 Sample1 を S1 にリネームしています。

> input_data
# A tibble: 3 x 3
  Id    Sample1 Sample2
  <chr>   <dbl>   <dbl>
1 id1         1       4
2 id2         2       5
3 id3         3       6
>
>
> input_data %>% rename("S1" = Sample1)
# A tibble: 3 x 3
  Id       S1 Sample2
  <chr> <dbl>   <dbl>
1 id1       1       4
2 id2       2       5
3 id3       3       6

従来のデータフレームのように colnames() を使うこともできます。変更する列が多い場合は、こちらの方が便利かもしれません。元のオブジェクトを上書きしてしまうため、注意が必要です。

> colnames(input_data) <- c("Id", "S1", "S2")
> input_data
# A tibble: 3 x 3
  Id       S1    S2
  <chr> <dbl> <dbl>
1 id1       1     4
2 id2       2     5
3 id3       3     6

str_replace と組み合わせることもできます。例では、S を Sample に置換しています。

> colnames(input_data)
[1] "Id" "S1" "S2"
>
> colnames(input_data) <- colnames(input_data) %>%
 str_replace("S", "Sample")
>
> input_data
# A tibble: 3 x 3
  Id    Sample1 Sample2
  <chr>   <dbl>   <dbl>
1 id1         1       4
2 id2         2       5
3 id3         3       6
 

データフレームから tibble に変換: as_tibble, rownames_to_column

データは、tibble 形式だけで統一できるとスッキリしますが、まだまだ、古いパッケージを利用することも多いと思います。その場合、結果のオブジェクトがデータフレーム形式であることも多いでしょう。

> input_df <- read.delim("input_data.tsv", row.names = 1)
>
> # data.frame 形式のテーブル
> input_df
    Sample1 Sample2
id1       1       4
id2       2       5
id3       3       6

下記のように as_tibble() 関数で、データフレームから tibble に変換できます。tibble は、rownames を持たないため、データフレームの rownames を普通の列 (column) に変換しておく必要があります。その名の通りの関数 rownames_to_column() も準備されています。

> as_tibble(rownames_to_column(input_df, "Id"))
# A tibble: 3 x 3
  Id    Sample1 Sample2
  <chr>   <int>   <int>
1 id1         1       4
2 id2         2       5
3 id3         3       6

複雑なオブジェクトの場合は、rownames_to_column() の前に、as.data.frame() などとしておきます。

> as_tibble(rownames_to_column(as.data.frame(input_df), "Id"))
# A tibble: 3 x 3
  Id    Sample1 Sample2
  <chr>   <int>   <int>
1 id1         1       4
2 id2         2       5
3 id3         3       6

逆に、tibble からデータフレームにする必要があれば、 column_to_rownames() 関数を使います。引数で、どの列を rownames にするか指定します。

> input_data
# A tibble: 3 x 3
  Id    Sample1 Sample2
  <chr>   <dbl>   <dbl>
1 id1         1       4
2 id2         2       5
3 id3         3       6
>
>
> column_to_rownames(input_data, "Id")
    Sample1 Sample2
id1       1       4
id2       2       5
id3       3       6
 

R (tidyverse) ワードカウント: group_by(), summarize()

tidyverse では、ワードカウントも、group_by() 関数に続いて、 summarize() 関数を使うと、簡単に記述できます。

下記のように複数の Symbol がある時、AAA は3個、CCC は2個と数えるようなケースです。

> meta_data %>% select(Id, Symbol)
# A tibble: 9 x 2
  Id    Symbol
  <chr> <chr>
1 id1   AAA
2 id2   AAA
3 id3   AAA
4 id4   BBB
5 id5   BBB
6 id6   BBB
7 id7   CCC
8 id8   CCC
9 id9   DDD

カウントするために、いったん、 mutate(count = 1) として、計算用のデータを格納しておきます。

> meta_data %>% select(Id, Symbol) %>% mutate("count" = 1)

# A tibble: 9 x 3
  Id    Symbol count
  <chr> <chr>  <dbl>
1 id1   AAA        1
2 id2   AAA        1
3 id3   AAA        1
4 id4   BBB        1
5 id5   BBB        1
6 id6   BBB        1
7 id7   CCC        1
8 id8   CCC        1
9 id9   DDD        1

group_by(Symbol) %>% summarize("total" = sum(count)) として、カウントの合計を求めることができます。続けて書くと、下記のようなコードになります。

result_data <- meta_data %>%
  select(Id, Symbol)     %>%
  mutate("count" = 1)    %>%
  group_by(Symbol)       %>%
  summarize(total = sum(count))
>
>
> result_data
# A tibble: 4 x 2
  Symbol total
  <chr>  <dbl>
1 AAA        3
2 BBB        3
3 CCC        2
4 DDD        1

ちなみに、 summarize("total" = sum(Symbol)) とすることはできません。sum() 関数が integer や double などの数値を引数とすることに対して、Symbol は character であり、型が異なるためです。

 

R (tidyverse), group_by, top_n グループごとの上位を求める

group_by() 関数と top_n() 関数を組み合わせることで、グループごとの上位を求めることができます。

例えば、下記のように同じ Symbol を持つグループのデータがあったとします。

> result_data
# A tibble: 9 x 5
  Id    Symbol Sample1 Sample2 Ratio
  <chr> <chr>    <dbl>   <dbl> <dbl>
1 id1   AAA          1       4  4
2 id2   AAA          2       5  2.5
3 id3   AAA          3       6  2
4 id4   BBB          4       1  0.25
5 id5   BBB          5       2  0.4
6 id6   BBB          6       3  0.5
7 id7   CCC          3       4  1.33
8 id8   CCC          2       5  2.5
9 id9   DDD          1       6  6

この時、各シンボルごとに1番 Ratio の高いデータだけを選ぶには、 group_by(Symbol) として、グループ化したのち、 top_n(1, Ratio) を適応すれば良いです。

実行結果は、下記のようになります。

> result_data %>% group_by(Symbol) %>% top_n(1, Ratio)
# A tibble: 4 x 5
# Groups:   Symbol [4]
  Id    Symbol Sample1 Sample2 Ratio
  <chr> <chr>    <dbl>   <dbl> <dbl>
1 id1   AAA          1       4   4
2 id6   BBB          6       3   0.5
3 id8   CCC          2       5   2.5
4 id9   DDD          1       6   6

 

R (tidyverse), top_n() 上位を抽出

テーブルから、ある列の上位を抽出するには、 top_n() 関数を使います。

top_n(上位いくつまで, 対象の列)

ratio を計算して、上位2つを表示した例です。

top2 <- result_data %>%
  mutate("Ratio" = Sample2 / Sample1) %>%
  top_n(2, Ratio)

> top2
# A tibble: 2 x 6
  Id    Symbol Description   Sample1 Sample2 Ratio
  <chr> <chr>  <chr>           <dbl>   <dbl> <dbl>
1 id1   AAA    lorem ipsum a       1       4   4
2 id2   BBB    lorem ipsum b       2       5   2.5

逆に、下位を求める場合は、順位にマイナス(-)を付けます。

bottom2 <- result_data %>%
  mutate("Ratio" = Sample2 / Sample1) %>%
  top_n(-2, Ratio)

> bottom2
# A tibble: 2 x 6
  Id    Symbol Description   Sample1 Sample2 Ratio
  <chr> <chr>  <chr>           <dbl>   <dbl> <dbl>
1 id2   BBB    lorem ipsum b       2       5   2.5
2 id3   CCC    lorem ipsum c       3       6   2