'x' должен быть массивом не менее двух измерений - PullRequest
0 голосов
/ 26 марта 2019

У меня есть фрейм данных с 20 переменными и 20000 наблюдениями. Сначала я конвертирую это во все логические значения, чтобы указать, превышает ли каждое исходное значение какой-либо порог (здесь порог равен >=1).

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

Я попробовал следующее, но вторая строка выдает сообщение об ошибке:

MyData_filter <- as.matrix(MyData[1:20] >= 1)
keeps <- apply(MyData_filter, 1,function(x) {! any(rowSums(x[1:10])>=5) && any(rowSums(x[11:20])>=5) })
MyData_Filtered<- MyData_filter[keeps, ]
Error in rowSums(MyData_filter[1:10]) : 
  'x' must be an array of at least two dimensions

1 Ответ

1 голос
/ 26 марта 2019

Проблема связана с использованием rowSums, что предполагает двумерный ввод. Но вы apply используете функцию по одной строке за раз, и поэтому вход x является одномерным вектором. Измените rowSums на sum:

function(x) {! any(sum(x[1:10])>=5) && any(sum(x[11:20])>=5) })

Кроме того, если я правильно понимаю ваш вопрос, ! должен применяться к обоим критериям, но сейчас он влияет только на первый критерий. Так что измените ! any() && any() на !(any() && any()).


Вот альтернативный подход, который не использует apply:

# create example data
set.seed(1234)
MyData <- as.data.frame(matrix(runif(200, 0, 2), 10, 20))

# convert to true/false for above threshold
MyData_filter <- MyData >= 1

# perform your 10-columns-at-a-time check
keeps <- rowSums(MyData_filter[ , 1:10])<5 & 
         rowSums(MyData_filter[ ,11:20])<5

# filter your data according to that 10-columns-at-a-time check
MyData_Filtered <- MyData_filter[keeps, ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...