Как выбрать столбцы по имени или их стандартное отклонение одновременно? - PullRequest
3 голосов
/ 09 апреля 2019

Решение

Я пошел с решением, предоставленным @thelatemail, потому что я пытаюсь придерживаться tidyverse и, следовательно, dplyr - я все еще новичок в R, поэтому я 'Я делаю шаги для ребенка и пользуюсь вспомогательными библиотеками.Спасибо всем, что нашли время для внесения решений.

df_new <- df_inh %>%
select(
  isolate,
  Phenotype,
  which(
    sapply( ., function( x ) sd( x ) != 0 )
  )
)

Вопрос

Я пытаюсь выбрать столбцы, если имя столбца "изолировать" или "Фенотип »или если стандартное отклонение значений столбца не равно 0.

Я пробовал следующий код.

df_new <- df_inh %>%
# remove isolate and Phenotype column for now, don't want to calculate their standard deviation
select(
  -isolate,
  -Phenotype
) %>%
# remove columns with all 1's or all 0's by calculating column standard deviation
select_if(
  function( col ) return( sd( col ) != 0 )
) %>%
# add back the isolate and Phenotype columns
select(
  isolate,
  Phenotype
)

Я также пробовал это

df_new <- df_inh %>%
select_if(
  function( col ) {
  if ( col == 'isolate' | col == 'Phenotype' ) {
    return( TRUE )
  }
  else {
    return( sd( col ) != 0 )
  }
}
)

Я могу выбрать столбцы по стандартному отклонению или по имени столбца, но не могу сделать это одновременно.

Ответы [ 2 ]

4 голосов
/ 09 апреля 2019

Не уверен, что вы можете сделать это только с select_if, но один из способов - объединить две операции select и затем связать столбцы. Использование mtcars в качестве образца данных.

library(dplyr)
bind_cols(mtcars %>% select_if(function(x) sum(x) > 1000), 
          mtcars %>% select(mpg, cyl))

#    disp  hp  mpg cyl
#1  160.0 110 21.0   6
#2  160.0 110 21.0   6
#3  108.0  93 22.8   4
#4  258.0 110 21.4   6
#5  360.0 175 18.7   8
#6  225.0 105 18.1   6
#7  360.0 245 14.3   8
#8  146.7  62 24.4   4
#....

Однако, если столбец удовлетворяет обоим условиям (выбирается в select_if, а также select), столбец будет повторяться.

Мы также можем использовать базу R, которая дает тот же вывод, но избегает выбора столбца дважды с помощью unique.

sel_names <- c("mpg", "cyl")
mtcars[unique(c(sel_names, names(mtcars)[sapply(mtcars, sum) > 1000]))]

Так что для вашего случая две версии будут:

bind_cols(df_inh %>% select_if(function(x) sd(x) != 0), 
          df_inh %>% select(isolate, Phenotype))

и

sel_names <- c("isolate", "Phenotype")
df_inh[unique(c(sel_names, names(df_inh)[sapply(df_inh, sd) != 0]))]
3 голосов
/ 09 апреля 2019

Я бы не использовал функции обратного хода вообще для этой задачи.

df_new <- df_inh[,c(grep("isolate", names(df_inh)), 
                    grep("Phenotype", names(df_inh), 
                    which(sapply(df_inh, sd) != 0))]

Выше вы просто индексировали, используя [] по каждому критерию, используя grep и which

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...