Я знаю, что это распространенная проблема, но я не могу сделать эту работу.
Я хочу построить все возможные пары строк в кадре данных на каждом уровне категориальной переменной name
и затем сделайте различия этих строк в пределах каждого уровня name
для всех нефакторных переменных: строка 1 - строка 2, строка 1 - строка 3,…
set.seed(9)
df <- data.frame(ID = 1:10,
name=as.factor(rep(LETTERS, each=4)[1:10]),
X1 = sample(1001, 10),
X2 = sample(1001, 10),
bool=sample(c(TRUE, FALSE), 10, replace = TRUE),
fruit = as.factor(sample(c("Apple", "Orange", "Kiwi" ), 10, replace = TRUE)))
Вот как выглядит пример:
ID name X1 X2 bool fruit
1 1 A 222 118 FALSE Apple
2 2 A 25 9 TRUE Kiwi
3 3 A 207 883 TRUE Orange
4 4 A 216 301 TRUE Kiwi
5 5 B 443 492 FALSE Apple
6 6 B 134 499 FALSE Kiwi
7 7 B 389 401 TRUE Kiwi
8 8 B 368 972 TRUE Kiwi
9 9 C 665 356 FALSE Apple
10 10 C 985 488 FALSE Kiwi
Я хочу получить кадр данных из 13 строк, который выглядит следующим образом:
ID name X1 X2 bool fruit
1 1-2 A 197 109 -1 Apple
2 1-3 A 15 -765 -1 Kiwi
…
Обратите внимание, что коэффициент fruit
должно быть неизменным.Но это бонус, я хочу прежде всего изменить X1
и X2
и сохранить коэффициент name
.
Я знаю, что могу использовать функцию combn
, но я непосмотрим, как это сделать.Я бы предпочел решение с пакетом dplyr
и функцией group_by
.
Мне удалось создать все различия для последовательных строк с помощью dplyr
, используя
varnotfac <- names(df)[!sapply(df, is.factor )] # remove factorial variable
# but not logical variable
library(dplyr)
diff <- df%>%
group_by(name) %>%
mutate_at(varnotfac, funs(. - lead(.))) %>% #
na.omit()