スペースと特殊文字を含む列名が含まれるティブルを使用すると、操作が面倒になります。データを操作しているときに、これらの列名をより使いやすい名前に変更し、表示のために最後に元の名前に戻します。理想的には、これをパイプの一部として実行できるようにしたいのですが、でそれを実行する方法がわかりませんrename_with()
。
サンプルデータ:
df <- tibble(oldname1 = seq(1:10),
oldname2 = letters[seq(1:10)],
oldname3 = LETTERS[seq(1:10)])
cols_lookup <- tibble(old_names = c("oldname4", "oldname2", "oldname1"),
new_names = c("newname4", "newname2", "newname1"))
望ましい出力:
> head(df_renamed)
# A tibble: 6 x 3
newname1 newname2 oldname3
<int> <chr> <chr>
1 1 a A
2 2 b B
3 3 c C
4 4 d D
5 5 e E
6 6 f F
一部の列は削除され、この作業中に並べ替えられます。そのため、それらを元に戻すと、cols_lookup
テーブルには存在しなくなったエントリが存在しdf
ます。df
同じ名前を付けておきたい新しい列も作成されています。
私はすでに尋ねられている同様の質問があることを知っていますが、答えは、ティブルまたはパイプ(たとえばmatch()
、を使用するもの)ではうまく機能しないか、列がすべてに存在しない場合は機能しません両方のテーブルで同じ順序。
使用できますrename_at
。マスタールックアップテーブルから、データセットのが一致filter
する行names
(filtered_lookup)
、次にrename_at
「old_names」を指定し、「new_names」でvars
置き換える場所でそれを使用します
library(dplyr)
filtered_lookup <- cols_lookup %>%
filter(old_names %in% names(df))
df %>%
rename_at(vars(filtered_lookup$old_names), ~ filtered_lookup$new_names)
またはをrename_with
使用して、同じロジックを使用します
df %>%
rename_with(.fn = ~filtered_lookup$new_names, .cols = filtered_lookup$old_names)
または別のオプションは、名前付きベクトルからのrename
スプライシング(!!!
)を使用することです
library(tibble)
df %>%
rename(!!! deframe(filtered_lookup[2:1]))
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加