Rでサブセット関数を使用するときに大文字と小文字を区別しない方法は?
eos91corr.data <- subset(test.data,select=c(c(X,Y,Z,W,T)))
名前が x、y、z、w、t の列を選択したいと思います。私は何をすべきか?
ありがとう
subset()
関数なしで生活できる場合、関数はtolower()
機能する可能性があります。
dat <- data.frame(XY = 1:5, x = 1:5, mm = 1:5,
y = 1:5, z = 1:5, w = 1:5, t = 1:5, r = 1:5)
dat[,tolower(names(dat)) %in% c("xy","x")]
ただし、これはdata.frame
、元のデータセットにある順序で列を含む を返しますdat
。両方
dat[,tolower(names(dat)) %in% c("xy","x")]
と
dat[,tolower(names(dat)) %in% c("x","xy")]
ターゲット名の順序が逆になっていますが、同じ結果が得られます。
結果の列をターゲット ベクトルの順序にしたい場合は、少し工夫する必要があります。次の 2 つのコマンドは両方ともdata.frame
、ターゲット ベクトルの順序で列を含む を返します (つまり、列が入れ替わると結果が異なります)。
dat[,sapply(c("x","xy"),FUN=function(foo)which(foo==tolower(names(dat))))]
dat[,sapply(c("xy","x"),FUN=function(foo)which(foo==tolower(names(dat))))]
関数で正規表現を使用して、grep
選択する列名を識別するときに大文字と小文字を区別できません。必要な列名を特定したら、これらを に渡すことができますsubset
。
あなたのデータが
dat <- data.frame(xy = 1:5, x = 1:5, mm = 1:5, y = 1:5, z = 1:5,
w = 1:5, t = 1:5, r = 1:5)
# xy x mm y z w t r
# 1 1 1 1 1 1 1 1 1
# 2 2 2 2 2 2 2 2 2
# 3 3 3 3 3 3 3 3 3
# 4 4 4 4 4 4 4 4 4
# 5 5 5 5 5 5 5 5 5
それで
(selNames <- grep("^[XYZWT]$", names(dat), ignore.case = TRUE, value = TRUE))
# [1] "x" "y" "z" "w" "t"
subset(dat, select = selNames)
# x y z w t
# 1 1 1 1 1 1
# 2 2 2 2 2 2
# 3 3 3 3 3 3
# 4 4 4 4 4 4
# 5 5 5 5 5 5
編集列名が1文字より長い場合、上記のアプローチはうまく機能しません。したがって、目的の列名をベクトルで取得できると仮定すると、次を使用できます。
upperNames <- c("XY", "Y", "Z", "W", "T")
(grepPattern <- paste0("^", upperNames, "$", collapse = "|"))
# [1] "^XY$|^Y$|^Z$|^W$|^T$"
(selNames2 <- grep(grepPattern, names(dat), ignore.case = TRUE, value = TRUE))
# [1] "xy" "y" "z" "w" "t"
subset(dat, select = selNames2)
# xy y z w t
# 1 1 1 1 1 1
# 2 2 2 2 2 2
# 3 3 3 3 3 3
# 4 4 4 4 4 4
# 5 5 5 5 5 5
「stringr」ライブラリは、このすべての機能の非常にきちんとしたラッパーです。次のように「ignore.case」オプションがあります。
also, you may want to consider using match not subset.