11

数値列と非数値列で構成されるデータフレームがあります。

非数値列のみを抽出(サブセット)したいので、文字列を抽出します。文字列:を使用して数値列をサブセット化することはsub_num = x[sapply(x, is.numeric)]できましたが、フォームを使用して反対のことを行うことはできませんis.character。誰か助けてもらえますか?

4

6 に答える 6

10

わかりました、私は自分のアイデアについて簡単に試しました。

次のコードスニペットが機能していることを確認できました。

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

于 2012-05-12T15:12:28.087 に答える
6

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]>
于 2018-11-01T14:08:04.980 に答える
2

試す:

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))]
于 2012-05-12T15:13:15.743 に答える
1

他の以前の答えはそれほど明確ではありません。だから私はこのアプローチを投稿します。文字列の名前を取得するには、次の操作を実行できます。

chrs <- sapply(df_data, is.character)
chrCols <- names(df_data[, chrs])
于 2016-08-10T02:35:58.807 に答える
0

@タイラーの例を使用する

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
于 2018-02-07T07:40:24.360 に答える
0

最新のdplyr更新によると:

starwars %>% 
  select(where(is.character))

/などに切り替えることができis.characterます。is.numericis.factor

別の方法は、パッケージからkeepまたはdiscard関数を使用することです。purrr

starwars %>% 
  purrr::keep(~is.character(.)) 

starwars %>% 
  purrr::discard(~!is.character(.))
于 2022-01-05T12:17:00.973 に答える