R / dplyr组中的工程变更

时间:2019-04-03 23:15:20

标签: r dplyr

停留在R中的计算上。假设我有以下数据框:

Name | Date | Count
Bob | 2019-03-03 | 253
Bob | 2019-03-03 | 253
Bob | 2019-03-02 | 252
Bob | 2019-03-01 | 251
Tim | 2019-03-04 | 257
Tim | 2019-03-04 | 257
Tim | 2019-03-04 | 256
Tim | 2019-03-03 | 254

我的目标是设计一个绝对变化的专栏,就像这样:

Name | Date | Count | Change
Bob | 2019-03-03 | 253 | 0
Bob | 2019-03-03 | 253 | 1
Bob | 2019-03-02 | 252 | 1
Bob | 2019-03-01 | 251 | 0
Tim | 2019-03-04 | 257 | 0
Tim | 2019-03-04 | 257 | 1
Tim | 2019-03-04 | 256 | 2
Tim | 2019-03-03 | 254 | 0

我显然可以

df %>% group_by(Name) %>% arrange(desc(Date)) %>% arrange(desc(Count))

但是在那之后,我迷路了。我会以某种方式变异(Change = Count)吗?

3 个答案:

答案 0 :(得分:4)

使用基于R和diff的{​​{1}}的解决方案。

dplyr

数据

library(dplyr)
library(tidyr)

df2 <- df %>%
  group_by(Name) %>%
  mutate(Change = c(-diff(Count), 0)) %>%
  ungroup()
df2
# # A tibble: 8 x 4
#   Name  Date       Count Change
#   <chr> <chr>      <int>  <dbl>
# 1 Bob   2019-03-03   253      0
# 2 Bob   2019-03-03   253      1
# 3 Bob   2019-03-02   252      1
# 4 Bob   2019-03-01   251      0
# 5 Tim   2019-03-04   257      0
# 6 Tim   2019-03-04   257      1
# 7 Tim   2019-03-04   256      2
# 8 Tim   2019-03-03   254      0

答案 1 :(得分:3)

我们可以group_by Name并使用lead中的dplyr来逐行减去当前行中的值。

library(dplyr)

df %>%
  group_by(Name) %>%
  mutate(Change = Count - lead(Count, default = last(Count)))

#  Name  Date       Count Change
#  <chr> <chr>      <dbl>  <dbl>
#1 Bob   2019-03-03   253      0
#2 Bob   2019-03-03   253      1
#3 Bob   2019-03-02   252      1
#4 Bob   2019-03-01   251      0
#5 Tim   2019-03-04   257      0
#6 Tim   2019-03-04   257      1
#7 Tim   2019-03-04   256      2
#8 Tim   2019-03-03   254      0

使用ave

的基本R方法
with(df, ave(Count, Name, FUN = function(x) c(x[-length(x)] - x[-1], 0)))
#[1] 0 1 1 0 0 1 2 0

答案 2 :(得分:1)

使用find . -name '*.pdf' -exec sh -c 'if="{}"; of=$(echo $if|tr "()_:-" " " ); mv "$if" "$of" ;' \;

data.table

注意:它也是thisthisthisthis帖子的重复