2016-05-18 3 views
0

У меня есть кадр данных из 14 столбцов и тысяч строк. Я хочу подсчитать или выбрать строки, где значение в столбце 1 равно 0 и больше 0 в остальных 13 столбцах, а затем подсчитать, что значение равно 0 во втором столбце и более 0 в остальных 13 столбцах и т. Д. Для всех 14 столбцов , Любой намек на то, как это сделать?Условие повторения по столбцам

Большое спасибо

+1

Что вы сделали до сих пор? Пожалуйста, покажите усилия, чтобы решить проблему самостоятельно. –

ответ

0

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

df <- data.frame(replicate(14, sample(0:5, 1000, replace = T))) 
result <- sapply(1:14, function(i) {sum(df[,i]==0 & apply(df[-i]>0, 1, all))}) 
names(result) <- paste0("Col_", 1:14) 
result 

Col_1 Col_2 Col_3 Col_4 Col_5 Col_6 Col_7 Col_8 Col_9 Col_10 Col_11 Col_12 Col_13 Col_14 
12  12  19  15  18  20  19  13  19  15  12  17  15  18 
0

Вы знаете о функции apply? Если вы напишете функцию, которая считывает вектор длиной 14 и выдает T или F в зависимости от того, удовлетворяет ли вектор требованиям, то вы можете использовать apply для применения этой функции ко всем строкам data.frame, давая вектор тысяч T s и F s, которые могут быть использованы для выбора или подсчета (последний, просто поместив вектор в функцию sum).

Пример:

cow <- function(colnr, x){#colnr is number of column you want zero, x is vector of length 14 
    all(x[-colnr] > 0) & x[colnr] == 0) 
} 
horse <- function(colnr){#produces sequence of Trues and Falses telling you which columns satisfy the condition 
     apply(yourdataframe, 1, cow) 
} 

#example output: 
horse(1) 

#while we're at it: create a vector of length 14 containing the number of rows satisfying the 14 conditions: 
sapply(seq(1:14), horse) 

1 в apply потому, что вы хотите применить к строкам, а не столбцы. Функция sapply подобна применению, но затем применяет функцию к каждому элементу вектора, а не к каждой строке кадра данных.

Обновление: этот ответ такой же, как и zyunaidi, который появился во время ввода.

+0

Спасибо Винсент. – p2016k

0

Используя данные образца от zyurnaidi, вы можете это сделать. Найти все 0 значения в вашем data.frame используя which с индексами массива устанавливается на TRUE, затем удалить дубликаты строк (0 в других столбцах) и подсчитать вхождение каждого столбца:

set.seed(1234) 
df <- data.frame(replicate(14, sample(0:5, 1000, replace = T))) 
a <- which(df == 0, arr.ind = T) 

table(a[ !(duplicated(a[, 1]) | duplicated(a[, 1], fromLast=T)), 2]) 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 
18 26 19 14 11 20 21 10 24 21 15 11 22 11