R - найти строки по крайней мере с n различными элементами - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть фрейм данных произвольного, но нетривиального размера.Каждая запись имеет одно из трех различных значений: 0, 1 или 2, распределенных случайным образом.Например:

col.1 col.2 col.3 col.4 ...
0     0     1     0     ...
0     2     2     1     ...
2     2     2     2     ...
0     0     0     0     ...
0     1     1     1     ...
...   ...   ...   ...   ...

Моя цель - удалить любую строку, содержащую только один уникальный элемент, или выбрать только те строки, которые содержат как минимум два отдельных элемента.Первоначально я выбрал те строки, в которых среднее число строк представляло собой не целое число, но я понял, что можно исключить строки, содержащие равные количества 0 и 2, которые я хочу сохранить.

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

DataFrame[length(unique(DataFrame)) != 1, ]

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018

Попробуйте любой из них:

nuniq <- function(x) length(unique(x))
subset(dd, apply(dd, 1, nuniq) >= 2)

subset(dd, apply(dd, 1, sd) > 0)

subset(dd, apply(dd[-1] != dd[[1]], 1, any))

subset(dd, rowSums(dd[-1] != dd[[1]]) > 0)

subset(dd, lengths(lapply(as.data.frame(t(dd)), unique)) >= 2)

subset(dd, lengths(apply(dd, 1, table)) >= 2)

# nuniq is from above
subset(dd, tapply(as.matrix(dd), row(dd), nuniq) >= 2)

, дающий:

  col.1 col.2 col.3 col.4
1     0     0     1     0
2     0     2     2     1
5     0     1     1     1

Альтернативы nuniq

В приведенном выше тексте nuniq можно заменить любым из этих:

function(x) nlevels(factor(x))

function(x) sum(!duplicated(x))

funtion(x) length(table(x))

dplyr::n_distinct

Примечание

dd в воспроизводимой форме:

dd <- structure(list(col.1 = c(0L, 0L, 2L, 0L, 0L), col.2 = c(0L, 2L, 
2L, 0L, 1L), col.3 = c(1L, 2L, 2L, 0L, 1L), col.4 = c(0L, 1L, 
2L, 0L, 1L)), class = "data.frame", row.names = c(NA, -5L))
0 голосов
/ 29 сентября 2018

Как насчет этого:

# some fake data
df<-data.frame(col1 = c(2,2,1,1),
col2 = c(1,0,2,0),col3 = c(0,0,0,0))
      col1 col2 col3
1    2    1    0
2    2    0    0
3    1    2    0
4    1    0    0

# first we can convert 0 to NA
df[df == 0] <- NA

# a function that calculates the length of uniques, not counting NA as levels
fun <- function(x){
                   res <-  unique(x[!is.na(x)])
                   length(res)
                  }

# apply it: not counting na, we can use 2 as threshold
df <- df[apply(df,1,fun)>=2,]

# convert the na to 0 as original
df[is.na(df)] <- 0
df
  col1 col2 col3
1    2    1    0
3    1    2    0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...