Подсчет уникальных экземпляров в строках между двумя столбцами, заданными индексом - PullRequest
1 голос
/ 21 октября 2019

Привет У меня есть пример фрейма данных следующим образом. Я хотел бы подсчитать количество экземпляров уникального значения (пример 1), которые встречаются между столбцами, заданными индексами ind1 и ind2. Выходом будет вектор с номером для каждой строки, который является числом экземпляров для этой строки.

COL1 <- c(1,1,1,NA,1,1)
COL2 <- c(1,NA,NA,1,1,1)
COL3 <- c(1,1,1,1,1,1)
ind1 <- c(1,2,1,2,1,2)
ind2 <- c(3,3,2,3,3,3)
Data <- data.frame (COL1, COL2, COL3, ind1, ind2)
Data
COL1 COL2 COL3 ind1 ind2
1    1    1    1    3    
1    NA   1    2    3
1    NA   1    1    2   
NA   1    1    2    3
1    1    1    1    3
1    1    1    2    3

, поэтому вывод примера должен выглядеть следующим образом:

3, 1, 1, 2, 3, 2

В моем наборе фактических данных много строк, поэтому я хочу максимально избегать циклов, чтобы сэкономить время. Я думал, что функция apply с суммой (которая (x == 1)) может работать, я просто не уверен, как получить значения столбца из данных индексов.

1 Ответ

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

Можно было бы выполнить цикл по строкам, извлечь значения, основанные на индексе последовательности, от 'ind1' до 'ind2' и получить счет с помощью table

apply(Data, 1, function(x) table(x[x['ind1']:x['ind2']]))
#[1] 3 1 1 2 3 2

Или используя sum

apply(Data, 1, function(x) sum(x[x['ind1']:x['ind2']] == 1, na.rm = TRUE))

Или создайте логическую матрицу и затем используйте rowSums

rowSums(Data[1:3] * NA^!((col(Data[1:3]) >= Data$ind1) & 
       (col(Data[1:3]) <= Data$ind2)), na.rm = TRUE)
#[1] 3 1 1 2 3 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...