Подсчитайте, сколько значений переменной изменилось в соответствии с двумя другими переменными в одном и том же кадре данных - PullRequest
0 голосов
/ 25 января 2019

У меня есть нижеприведенный кадр данных, и я хочу подсчитать, сколько учеников (Name) изменили свою оценку (Val) с 2018 на 2019.Результат должен быть равен 1, так как только Bob изменил его.

Name<-c("bb","Bob","df","asd","Bob","df","asd","jkl")
Year<-c(2018,2018,2018,2018,2019,2019,2019,2019)
Val<-c(9,4,6,7,9,6,7,7)
gr<-data.frame(Name,Year, Val)




 Name Year Val
1   bb 2018   9
2  Bob 2018   4
3   df 2018   6
4  asd 2018   7
5  Bob 2019   9
6   df 2019   6
7  asd 2019   7
8  jkl 2019   7

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Сначала создайте массив, дающий стандартное отклонение значений для каждого Name. Это будет NA, если нет двух значений, 0, если два значения одинаковы, и> 0, если есть два значения, которые отличаются. который (...> 0) дает позиции значений> 0, и мы берем его длину, чтобы получить количество.

length(which(tapply(gr$Val, gr$Name, sd) > 0))
## [1] 1
0 голосов
/ 25 января 2019

Вы можете группировать по Name и проверять, отличается ли Val между годами.

sum(with(gr, ave(Val, Name, FUN = function(x) x[1]) != Val))
# [1] 1

пошагово

Для каждого имени заменитьЗначения для 2019 года совпадают со значениями первого года, то есть 2018.

with(gr, ave(Val, Name, FUN = function(x) x[1]))
#[1] 9 4 6 7 4 6 7 7

Затем проверьте, не отличаются ли эти значения между годами

with(gr, ave(Val, Name, FUN = function(x) x[1]) != Val)
# [1] FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE

И, наконец, вычислите суммуэтот вектор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...