2016-12-04 4 views
0

Uing R, я хочу подсчитать количество вхождений в двух переменных двумя другими переменными; IDS и год. Одна из подсчитанных переменных должна быть подсчитана по уникальному значению. Я действительно оглянулся, чтобы ответить на это, но я не могу найти его. У меня есть набор данных, как это (хотя в том числе и многие другие переменные):Как считать вхождения нескольких переменных по различным критериям и сгруппированы по двум переменным

IDS = c(1,1,1,1,1,1,2,2) 
year = c(1,1,1,1,1,2,1,1) 
x = c(5, 5, 5, 10, 2, NA, 3, 3) 
y = c(1, 2, 4, 0, NA, 2, 0, NA) 
dfxy = data.frame(IDS, year, x, y) 

dfxy 
    IDS year x y 
1 1 1 5 1 
2 1 1 5 2 
3 1 1 5 4 
4 1 1 10 0 
5 1 1 2 NA 
6 1 2 NA 2 
7 2 1 3 0 
8 2 1 3 NA 

Я хочу, чтобы подсчет количества вхождений в двух столбцах х и у каждого по IDS и каждый год. Счет в x должен быть уникальным значением x. Я хочу, чтобы выход, как это:

IDS year x y 
1 1 1 3 4 
2 1 2 0 1 
3 2 1 1 1 

Это похоже на ответ с cbind в

Aggregate/summarize multiple variables per group (i.e. sum, mean, etc)

который для меня будет выглядеть

aggregate(cbind(x, y)~IDS+year, data=dfxy, ???) 

НС не считается не встречаемость, любое число считается вхождением в y, в x каждое уникальное вхождение должно учитываться (пока оно не является NA). Нет строк с NA как в x, так и в y. Я попытался использовать длину вместо суммы, но это только, кажется, суммирует количество строк одинаково для x и y.

Идеи или ссылки Я могу найти ответ на этот вопрос? Благодаря

+0

Я предполагаю, 2-е значение «х» равно 0, как нет не-NA элементов – akrun

+0

Действительно, исправленные в настоящее время. – Lisarv

ответ

0

В aggregate, необходимо указать параметр na.action, как и с формулой интерфейса По умолчанию это значение na.omit, которые исключат большинство ваших данных:

aggregate(cbind(x, y) ~ IDS + year, dfxy, 
      FUN = function(x){sum(!is.na(x))}, na.action = na.pass) 
## IDS year x y 
## 1 1 1 3 3 
## 2 2 1 1 1 
## 3 1 2 0 1 

Для нового вопроса, добавьте unique:

aggregate(cbind(x, y) ~ IDS + year, df, 
      FUN = function(x){sum(!is.na(unique(x)))}, na.action = na.pass) 
## IDS year x y 
## 1 1 1 3 4 
## 2 2 1 1 1 
## 3 1 2 0 1 

или

aggregate(cbind(x, y) ~ IDS + year, df, 
      FUN = function(x){length(unique(na.omit(x)))}, na.action = na.pass) 
## IDS year x y 
## 1 1 1 3 4 
## 2 2 1 1 1 
## 3 1 2 0 1 
+0

Вопрос немного изменился, см. Выше, не видел вашего ответа во времени @alistaire, извините за это. – Lisarv

+0

И это сделало, спасибо большое! – Lisarv

0

Мы можем попытаться с dplyr

library(dplyr) 
dfxy %>% 
    group_by(IDS, year) %>% 
    summarise_each(funs(sum(!is.na(.)))) 
+1

Спасибо @akrun, отлично работал! Но см. Мой обновленный вопрос, потому что я что-то забыл (через минуту) – Lisarv

+0

@Lisarv. Спасибо за комментарии. вы также можете проверить [здесь] (http://stackoverflow.com/help/someone-answers) – akrun

+0

Итак, для предыдущего вопроса, где varible x НЕ нужно было подсчитывать по уникальным значениям, но вместо этого просто так же как y, ваш ответ был совершенным @akrun. Моя ошибка в том, что я обнаружил разницу в моих данных позже. – Lisarv

Смежные вопросы