我知道这是一个常见问题,但我无法完成这项工作。
我想在分类变量的每个级别内的数据框中构建所有可能的行对,然后在每个级别内为所有非因子变量生成这些行的差异:第 1 行 - 第 2 行,第 1 行 - 第 3 行, …</p>
name
name
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
应保持不变。但这是一个额外的好处,我首先希望改变 and 并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()