Условно подмножество данных кадра в R - PullRequest
0 голосов
/ 25 октября 2019

У меня есть фрейм данных, который имеет 10 столбцов и 510 строк. Я пытаюсь создать его подмножество, в котором, если сумма строк первых 5 столбцов равна 0, вся строка отбрасывается. Я читал на этом сайте сообщения о том, что вы не можете просто удалить строки в R, поэтому я попробовал следующее:

    data_sub <- data[!sum(data[, 1:5]==0), ]

Однако data_sub оказывается копией данных ... и я действительно не знаю, почему ... Пожалуйста, посоветуйте! Этот фрейм данных не имеет значений Inf или NaN, только целые числа.

Ответы [ 2 ]

1 голос
/ 25 октября 2019

Это то, что вы хотите

reprex[sum(reprex[,1:5])!=0,] 

возвращает набор данных, соответствующий вашим критериям. Это относится к массивам или фреймам данных. Однако обратите внимание, что оригинал НЕ ИЗМЕНЕН и не должен.

В будущем рассмотрите возможность включения воспроизводимого примера в качестве примера в приведенном ниже коде. Это не должно быть сложным, но я думаю, что вы найдете, что акт заставит вас прояснить ваше мышление. Это для меня!

# emily example

# sample column as a 50% chance of being zero and 50 percent chance of random 
set.seed(152)
sample_column<-function(col_length) {
  ifelse(runif(col_length)<0.5,0,runif(col_length))
}

# produce some columns of random numbers.  Spike it with 
# zeroes to make the filter actually catch some.

make_reprex<-function(nrows,ncols) {
  id=1:nrows
  colnames=paste0('x',1:ncols)
  data=matrix(nrow=nrows,ncol=ncols)
  rownames(data)=id
  colnames(data)=colnames
  for (j in 1:ncols) {
    data[,j]=sample_column(nrows)
  }
  return(data)
}

reprex=make_reprex(510,15)
# desired expression 
reprex[sum(reprex[,1:5]!=0),] 

Если вы хотите разместить данные как на месте, вам нужно сделать другое назначение.

reprex=reprex[sum(reprex[,1:5]!=0),] 

Я советую против такой замены на месте. В некоторых случаях это необходимо, но редко так часто, как вы думаете.

причина?

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

1 голос
/ 25 октября 2019

Попробуйте следующее:

ind <- apply(data, 1, function(x) sum(x[1:5]) != 0)
data_sub <- data[ind, ]

или

data_sub <- data[rowSums(data[,1:5]) != 0, ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...