2017-01-10 2 views
1

Я хочу знать, как я могу подсчитать количество наблюдений, содержащих аналогичное значение для переменных A и B, в целом наборе данных для каждого наблюдения.подсчеты в наборе данных, которые соответствуют (логическим) условиям r

Код показывает, что я пробовал возвращать 1 для переменной «a», где он должен вернуть 2 в лучшем случае, и 3, если не исключено исключение наблюдения, на которое он отмечен (см. набор данных).

observation A B 
1   1 1 1 
2   2 1 1 
3   3 3 2 
4   4 1 2 
5   5 1 1 
6   6 1 2 

Смотрите здесь мою попытку исправить это сам:

observation <- c(1,2,3,4,5,6) 
A <- c(1,1,3,1,1,1) 
B <- c(1,1,2,2,1,2) 
dataset <- data.frame(observation, A, B) 

for(i in 1:nrow(dataset)){ 
    if(dataset$A[i]==dataset$A[i]&dataset$B[i]==dataset$B[i]) 
    a <- +1 
} 

Давайте наблюдения 1, например. Вы можете видеть в данных, что счетчик для переменной «a» должен быть равен 2. Поскольку наблюдение 2 и наблюдение 5 имеют одинаковое значение для обеих переменных; они оба содержат 1, как это делает наблюдение 1.

Кроме того, он должен не только возвращать желаемое значение для «a» для наблюдения 1, но и для всех наблюдений. Таким образом, требуемый выход:

2 
2 
0 
1 
2 
1 

Заранее благодарен!

+0

Если мой ответ решил вашу проблему, не могли бы вы отметить ее как принятую? –

ответ

0

В базовой R, вы можете сделать это:

dataset[,"tuple_occurences"] <- NA 
for(i in 1:nrow(dataset)) { 
    dataset[i,"tuple_occurences"] <- 
    sum(dataset$A == dataset[i,"A"] & dataset$B == dataset[i, "B"]) - 1 
} 

редактировать: переписал код, потому что я неправильно понял вопрос

+0

Большое спасибо за ваше время и ответ. Хотя, это не совсем то, что я ищу, поскольку я хочу, чтобы он работал на целый набор данных, содержащий более широкий диапазон значений. Например, если была добавлена ​​7-я строка, содержащая 1 и 1 для A и B, то она вернет 2, тогда как есть еще 3 наблюдения, имеющие одинаковые значения для обоих. Было бы здорово, если бы вы поняли, что я имею в виду, и могли бы помочь мне :) – Floris

+0

спасибо, что прояснил это, я неправильно понял. Является ли новый ответ тем, что вы искали? –

1
library(dplyr) 
dataset %>% 
    group_by(A, B) %>% 
    mutate(count_of_similar_obs = n() - 1L) 
1

Один лайнер base R:

ave(dataset$observation,dataset$A,dataset$B,FUN=function(x) length(x) -1) 
#[1] 2 2 0 1 2 1 
Смежные вопросы