如何使用dplyr计算列范围内的两个连续列集之间的差异

时间:2019-05-29 19:55:24

标签: r dplyr

我想使用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解决方案。

3 个答案:

答案 0 :(得分:2)

这是使用dplyrtidyr动词的较不先进的方法。首先,我将要区别的列收集为长格式,然后将其与上一列进行区别,对没有上一列的前几列去掉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)

您还可以使用greplwhich来获取列索引。

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]")))
}