数値列と非数値列で構成されるデータフレームがあります。
非数値列のみを抽出(サブセット)したいので、文字列を抽出します。文字列:を使用して数値列をサブセット化することはsub_num = x[sapply(x, is.numeric)]
できましたが、フォームを使用して反対のことを行うことはできませんis.character
。誰か助けてもらえますか?
わかりました、私は自分のアイデアについて簡単に試しました。
次のコードスニペットが機能していることを確認できました。
str(d)
'data.frame': 5 obs. of 3 variables:
$ a: int 1 2 3 4 5
$ b: chr "a" "a" "a" "a" ...
$ c: Factor w/ 1 level "b": 1 1 1 1 1
# Get all character columns
d[, sapply(d, class) == 'character']
# Or, for factors, which might be likely:
d[, sapply(d, class) == 'factor']
# If you want to get both factors and characters use
d[, sapply(d, class) %in% c('character', 'factor')]
正しいクラスを使用すると、少なくとも関数の前にsapply
欠落しているものを挿入する限り、-approachも機能するはずです。,
sapply
グループに属していないクラスがある場合、を使用するアプローチ!is.numeric
はあまり拡張できません(たとえば、numeric, factor, character
私が頻繁に使用するクラスは)POSIXct
dplyr::select_if()
文字列のみを選択しようとしている場合、これはとで実行できますis.character()
。dplyr::starwars
例としてサンプルデータを使用する:
library(dplyr)
starwars %>%
select_if(is.character) %>%
head(2)
# A tibble: 2 x 7
name hair_color skin_color eye_color gender homeworld species
<chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 Luke Skywalker blond fair blue male Tatooine Human
2 C-3PO NA gold yellow NA Tatooine Droid
または、特定の列タイプを無効にしようとしている場合は、構文が少し異なることに注意してください。
starwars %>%
select_if(~!is.numeric(.)) %>%
head(2)
# A tibble: 2 x 10
name hair_color skin_color eye_color gender homeworld species films vehicles starships
<chr> <chr> <chr> <chr> <chr> <chr> <chr> <list> <list> <list>
1 Luke Skywalker blond fair blue male Tatooine Human <chr [5]> <chr [2]> <chr [2]>
2 C-3PO NA gold yellow NA Tatooine Droid <chr [6]> <chr [0]> <chr [0]>
試す:
x[sapply(x, function(x) !is.numeric(x))]
それは数値ではないものを引っ張るので、因子と文字。
編集:
x <- data.frame(a=runif(10), b=1:10, c=letters[1:10],
d=as.factor(rep(c("A", "B"), each=5)),
e=as.Date(seq(as.Date("2000/1/1"), by="month", length.out=10)),
stringsAsFactors = FALSE)
# > str(x)
# 'data.frame': 10 obs. of 5 variables:
# $ a: num 0.814 0.372 0.732 0.522 0.626 ...
# $ b: int 1 2 3 4 5 6 7 8 9 10
# $ c: chr "a" "b" "c" "d" ...
# $ d: Factor w/ 2 levels "A","B": 1 1 1 1 1 2 2 2 2 2
# $ e: Date, format: "2000-01-01" "2000-02-01" ...
x[sapply(x, function(x) !is.numeric(x))]
他の以前の答えはそれほど明確ではありません。だから私はこのアプローチを投稿します。文字列の名前を取得するには、次の操作を実行できます。
chrs <- sapply(df_data, is.character)
chrCols <- names(df_data[, chrs])
@タイラーの例を使用する
x <- data.frame(a=runif(10), b=1:10, c=letters[1:10],
d=as.factor(rep(c("A", "B"), each=5)),
e=as.Date(seq(as.Date("2000/1/1"), by="month", length.out=10)),
stringsAsFactors = FALSE)
In Base R
base::Filter(Negate(is.numeric),x)
c d e
1 a A 2000-01-01
2 b A 2000-02-01
3 c A 2000-03-01
4 d A 2000-04-01
5 e A 2000-05-01
6 f B 2000-06-01
7 g B 2000-07-01
8 h B 2000-08-01
9 i B 2000-09-01
10 j B 2000-10-01
最新のdplyr
更新によると:
starwars %>%
select(where(is.character))
/などに切り替えることができis.character
ます。is.numeric
is.factor
別の方法は、パッケージからkeep
またはdiscard
関数を使用することです。purrr
starwars %>%
purrr::keep(~is.character(.))
starwars %>%
purrr::discard(~!is.character(.))