我想使用dplyr计算列范围内连续列之间的差异。
例如,使用 iris 数据集,我希望能够指定范围 Sepal.Width:Petal.Width ,并具有一个包含原始图像的数据框 iris 数据以及Sepal.Width:Petal.Width:
中连续列之间的差异Type 'ResponseObjectMapper<UserMapper, ErrorMapper>' does not conform to protocol 'BaseMappable'
某人发布了一个解决方案循环并失败(Calculate the difference between consecutive, grouped columns in a data.table),但我专门在寻找dplyr解决方案。
答案 0 :(得分:2)
这是使用dplyr
和tidyr
动词的较不先进的方法。首先,我将要区别的列收集为长格式,然后将其与上一列进行区别,对没有上一列的前几列去掉NA,重命名该列,展开并附加到原始列上。
library(tidyverse)
iris %>%
bind_cols(iris %>%
rowid_to_column() %>%
gather(col, val, Sepal.Width:Petal.Width) %>%
group_by(rowid) %>%
mutate(val = abs(val - lag(val))) %>%
filter(!is.na(val)) %>%
mutate(col = paste0("diff_", col)) %>%
spread(col, val) %>%
select(contains("diff"))
)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species rowid diff_Petal.Length diff_Petal.Width
1 5.1 3.5 1.4 0.2 setosa 1 2.1 1.2
2 4.9 3.0 1.4 0.2 setosa 2 1.6 1.2
3 4.7 3.2 1.3 0.2 setosa 3 1.9 1.1
4 4.6 3.1 1.5 0.2 setosa 4 1.6 1.3
5 5.0 3.6 1.4 0.2 setosa 5 2.2 1.2
6 5.4 3.9 1.7 0.4 setosa 6 2.2 1.3
7 4.6 3.4 1.4 0.3 setosa 7 2.0 1.1
答案 1 :(得分:1)
这里是 class Meta:
model = Post
fields = ('author','title', 'text','image')
widgets = {
'title': forms.TextInput(attrs={'class': 'textinputclass'}),
'text': forms.Textarea(attrs={'class': 'editable medium-editor-textarea postcontent'}),
}
的一个选项。我们 <img src="{{post.image.url}}">
列的范围,将第一列和最后一列移至data.frames的tidyverse
中,然后使用select
来获取等维数据集之间的差异,然后重命名列
list
或者另一种方法是遍历列reduce
的列索引,library(dplyr)
library(purrr)
library(stringr)
out <- iris %>%
select(Sepal.Width:Petal.Width) %>%
{list(.[-length(.)], .[-1])} %>%
reduce(`-`) %>%
rename_all(~ str_c("diff", seq_along(.))) %>%
bind_cols(iris, .)
head(out)
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species diff1 diff2
#1 5.1 3.5 1.4 0.2 setosa 2.1 1.2
#2 4.9 3.0 1.4 0.2 setosa 1.6 1.2
#3 4.7 3.2 1.3 0.2 setosa 1.9 1.1
#4 4.6 3.1 1.5 0.2 setosa 1.6 1.3
#5 5.0 3.6 1.4 0.2 setosa 2.2 1.2
#6 5.4 3.9 1.7 0.4 setosa 2.2 1.3
用select
到单个列并与原始数据集绑定
reduce
答案 2 :(得分:0)
您还可以使用grepl
和which
来获取列索引。
start <- which(grepl("Sepal.Width", colnames(iris)))
end <- which(grepl("Petal.Width", colnames(iris)))
for (i in start:(end-1)) {
eval(parse(text = paste0("iris$diff",i-1," <- iris[,",i,"]-iris[,",i,"+1]")))
}