1

を使用して、複数のカテゴリ変数をブール列に展開していますtidyr::spread()。データには NA が含まれているspreadため、名前のない新しい列を作成します。

私が探しているのは、を使用してNAを取り除く方法です

select_()a) パイピング ソリューション (およびを試しまし'['()たが、NA 列の名前またはインデックスを参照する方法がわかりません) または

b)さらに優れたカスタム関数

c) 可能であれば、Hadleyverse と互換性のある NA 列を単純に生成しない方法。

以下は、私の現在の(そして非常に洗練されていない)ソリューションです。

library(tidyr)
library(dplyr)

test <- data.frame(id = 1:4, name = c("anna", "bert", "charles", "daniel"),
                   flower = as.factor(c("rose", "rose", NA, "petunia")),
                   music = as.factor(c("pop","classical", "rock", NA)),
                   degree = as.factor(c(NA, "PhD", "MSc", "MSc")))

test <- test %>% 
  mutate(truval = TRUE) %>% 
  spread(key = flower, value = truval, fill = FALSE)
test[ncol(test)] <- NULL

test <- test %>% 
  mutate(truval = TRUE) %>% 
  spread(key = music, value = truval, fill = FALSE)
test[ncol(test)] <- NULL

test <- test %>% 
  mutate(truval = TRUE) %>% 
  spread(key = degree, value = truval, fill = FALSE)
test[ncol(test)] <- NULL

test
4

2 に答える 2

2

「NA」列にselectを使用できます。backquotes

 test %>% 
    mutate(truval= TRUE) %>% 
    spread(flower, truval, fill=FALSE) %>% 
    select(-`NA`)
 #  id    name     music degree petunia  rose
 #1  1    anna       pop   <NA>   FALSE  TRUE
 #2  2    bert classical    PhD   FALSE  TRUE
 #3  3 charles      rock    MSc   FALSE FALSE
 #4  4  daniel      <NA>    MSc    TRUE FALSE

他の列の観測が関連付けられているため、NA列を生成しないのは難しいと思います。filterwithを使用しis.naて、'flower' 列に 'NA' を含む行を削除できますが、1 行が失われます。3列目。

于 2015-10-18T04:47:22.847 に答える
0

@akrun の応答に従って、逆引用符を使用して NA を参照できます。そして、これを処理する関数は次のとおりです。

Spread_bool <- function(df, varname) {
# spread a categorical variable to Boolean columns, remove NA column
# Input:
#  df: a data frame containing the variable to be spread
#  varname: the "quoted" name of the variable to be spread
#
# Return:
#  df: a data frame with the variable spread to columns

  df <- df %>% 
    mutate(truval = TRUE) %>% 
    spread_(varname, "truval", fill = FALSE) %>% 
    select(-`NA`)

  df

}
于 2015-10-18T20:21:34.597 に答える