对数据帧按升序应用滞后或超前

时间:2018-07-18 10:20:30

标签: r dataframe lag lead

df1 <- read.csv("C:/Users/uni/DS-project/df1.csv")
df1

    year value
1  2000     1
2  2001     2
3  2002     3
4  2003     4
5  2004     5
6  2000     1
7  2001     2
8  2002     3
9  2003     4
10 2004     5
11 2000     1
12 2001     2
13 2002     3
14 2003     4
15 2004     5
16 2000     1
17 2001     2
18 2002     3
19 2003     4
20 2004     5

我想加铅,这样我就可以按照以下方式获得输出。

我们设置了每年重复进行n次的5次观测,在第一年的输出中,我们需要删除2000及其相应的值,对于第二年,我们忽略2000和2001及其相应的值,对于第三年移除-2000、2001、2002及其相应的值。等等。

,以便我们可以通过以下方式获得以下输出。

output: 
year    value
2000    1
2001    2
2002    3
2003    4
2004    5
2001    2
2002    3
2003    4
2004    5
2002    3
2003    4
2004    5
2003    4
2004    5

请帮助。

5 个答案:

答案 0 :(得分:2)

只是为了好玩,使用矩阵子设置添加矢量化解决方案

let arr = [{id:0, value: "zero"}, 
           {id:1, value: "one"}, 
           {id:2, value: ''}];
           
           
console.log(arr.filter(a => a.value != ''));

答案 1 :(得分:1)

grp下,第一组的每一行为1,第二组的第二行,依此类推。对于每个grp的连续行,Seq是1,2,3,...。现在,只需选择Seq至少与grp一样大的行。对于i = 1,2,...,这具有从第i个组中删除前i-1行的效果。

grp <- cumsum(df1$year == 2000)
Seq <- ave(grp, grp, FUN = seq_along)
subset(df1, Seq >= grp)

我们可以用较不通用的形式写出来:

subset(df1, 1:5 >= rep(1:4, each = 5))

在任何情况下,任一子集语句的输出均为:

   year value
1  2000     1
2  2001     2
3  2002     3
4  2003     4
5  2004     5
7  2001     2
8  2002     3
9  2003     4
10 2004     5
13 2002     3
14 2003     4
15 2004     5
19 2003     4
20 2004     5

答案 2 :(得分:1)

library(dplyr)

df %>% 
  group_by(g = cumsum(year == 2000)) %>% 
  filter(row_number() >= g) %>% 
  ungroup %>% 
  select(-g)


# # A tibble: 14 x 2
#     year value
#    <int> <int>
#  1  2000     1
#  2  2001     2
#  3  2002     3
#  4  2003     4
#  5  2004     5
#  6  2001     2
#  7  2002     3
#  8  2003     4
#  9  2004     5
# 10  2002     3
# 11  2003     4
# 12  2004     5
# 13  2003     4
# 14  2004     5

答案 3 :(得分:0)

使用lapply()

to <- nrow(df) / 5 - 1
df[-unlist(lapply(1:to, function(x) seq(1:x) + 5*x)), ]
   year value
1  2000     1
2  2001     2
3  2002     3
4  2003     4
5  2004     5
7  2001     2
8  2002     3
9  2003     4
10 2004     5
13 2002     3
14 2003     4
15 2004     5
19 2003     4
20 2004     5

unlist(lapply(1:to, function(x) seq(1:x) + 5*x))是要跳过的索引:

[1]  6 11 12 16 17 18

答案 4 :(得分:0)

使用admin/config/services

function bright_menu() {
  $items = array();

  $items['admin/config/services/bright'] = array(
    'title' => 'Bright',
    'description' => 'Configuration for Bright module',
    'page callback' => 'drupal_get_form',
    'page arguments' => array('bright_form'),
    'access arguments' => array('access administration pages'),
    'type' => MENU_NORMAL_ITEM,
  );

  return $items;
}

它如何工作:

sequence