Исключить выбранные значения и NAs из colSums R

#r #dataframe

#r #фрейм данных

Вопрос:

У меня есть небольшой R dataframe, который можно воспроизвести из кода ниже

 structure(list(Replicate_No = 1:6, `1` = c(60.7, 60.83, 60.12, 
60.66, 60.51, 60.53), `2` = c(60.74, 60.9, 60.41, 60.7, 60.62, 
60.71), `3` = c(60.71, 60.65, 60.79, 60.75, 60.82, 60.82), `4` = c(60.7, 
60.7, 60.7, 60.6, 60.8, 61), `6` = c(60.704, 60.496, 60.742, 
60.831, 60.955, 60.698), `7` = c(60.74, 61.29, 60.68, 60.55, 
61.26, 60.46), `8` = c(60.89, 61.21, 61.04, 61.28, 61.05, 61.15
), `9` = c(60.67, 60.47, 60.74, 60.96, 60.58, 60.79)), row.names = c(NA, 
-6L), class = c("tbl_df", "tbl", "data.frame"))
  

значение 60.1 во 2-м столбце является выбросом, определенным из теста grubs. Я присвоил значение выброса grb.out. Я хочу выполнить подсчет столбцов, но исключить это значение из подсчета. Я изначально преобразовал значение выброса в NA и получил следующий код, который дал мне желаемый результат.

 df.count <- colSums(!is.na(df[, 2:length(df)]))
  

мой вопрос в том, как я могу использовать colSums или аналогичную другую функцию, чтобы не учитывать значения выбросов, а также игнорировать NA. Я хотел бы игнорировать NAs, а также время от времени у меня будут значения NA, но по разным причинам.

В качестве отправной точки попробовали

 df.count <- colSums(!= grb.out(df[, 2:length(df)]))
df.count <- colSums(!= 60.1 (df[, 2:length(df)]))

  

Я получаю сообщение об ошибке «неожиданно «!=» в df.count …

Любые советы были бы замечательными, советы или указания были бы замечательными.

Ответ №1:

Вы можете попробовать следующее с sapply :

 df.count <-  sapply(round(df[-1], 1) function(x) 
                     sum(!(x %in% grb.out | is.na(x))))
  

Или с dplyr :

 library(dplyr)
round(df, 1) %>% summarise(across(-1, ~sum(!(. %in% grb.out | is.na(.)))))
  

Комментарии:

1. спасибо, ваше первое решение работает. Я уже пробовал второе решение.

Ответ №2:

Предположим, что grb.out это a data.frame тех же размеров, что и ваш df . Попробуйте это:

 df.count <- colSums(df[, 2:length(df)] != grb.out)
df.count <- colSums(df[, 2:length(df)] != 60.1)
  

If grb.out — функция, которая принимает a data.frame в качестве своего первого аргумента, затем

 df.count <- colSums(df[, 2:length(df)] != grb.out(df[, 2:length(df)]))
  

Комментарии:

1. спасибо, ваши первые два решения отвечают на часть моего вопроса. Я также хотел бы объединить NA в код. В этом примере grb.out является единственным значением, которое = 60.1. У меня могут быть случаи, когда у меня есть несколько значений выбросов, которые необходимо учитывать, которые я бы, вероятно, сохранил как вектор