10

Rに次のデータフレームがあるとします。

df1 <- data.frame(Item_Name = c("test1","test2","test3"), D_1=c(1,0,1),
                  D_2=c(1,1,1), D_3=c(11,3,1))

分散のない列を削除する関数を作成したいと思います(たとえば、この場合、D_2値が1つしかないため、列を削除します)

手作業で確認できることは知っていますが、実はデータが非常に大きいので自動化したいと思います。何か案が?

4

3 に答える 3

16

Filterここで便利な関数です。一意の値が複数ある場合にのみフィルタリングします。

すなわち

Filter(function(x)(length(unique(x))>1), df1)

##   Item_Name D_1 D_3
## 1     test1   1  11
## 2     test2   0   3
## 3     test3   1   1
于 2012-09-11T03:09:16.073 に答える
10

できるよ:

df1[c(TRUE, lapply(df1[-1], var, na.rm = TRUE) != 0)]
#   Item_Name D_1 D_3
# 1     test1   1  11
# 2     test2   0   3
# 3     test3   1   1

ここで、lapplyどの変数に分散があるかがわかります。

lapply(df1[-1], var, na.rm = TRUE) != 0
#   D_1   D_2   D_3 
#   TRUE FALSE  TRUE 
于 2012-09-11T03:09:20.807 に答える
4

ではdplyr、を使用n_distinctして一意の値をカウントselect_ifし、列を選択できます

library(dplyr)
df1 %>% select(where(~n_distinct(.) > 1))
#For dplyr < 1.0.0
#df1 %>% select_if(~n_distinct(.) > 1)

#  Item_Name D_1 D_3
#1     test1   1  11
#2     test2   0   3
#3     test3   1   1

'sとpurrr'sで同じロジックを使用できますkeepdiscard

purrr::keep(df1, ~n_distinct(.) > 1)
purrr::discard(df1, ~n_distinct(.) == 1)

data.tableそれを行うその方法とは別に、

library(data.table)

setDT(df1)
df1[, lapply(df1, uniqueN) > 1, with = FALSE]

またはおそらくこれはより賢い/より良いです

df1[, .SD, .SDcols=lapply(df1, uniqueN) > 1]

上記のすべてのアプローチでは、数値列のみをサブセット化した後にn_distinct/uniqueNを置換varまたは機能させることができます。sd

例えば、

df1[-1] %>% select_if(~sd(.) != 0)
于 2019-12-04T10:09:41.617 に答える