确定先前行的值是否在数据框

时间:2016-01-05 20:17:11

标签: r

我有一些像这样组织的数据:

set.seed(12)

ids <- matrix(replicate(1000,sample(LETTERS[1:4],2)),ncol=2,byrow=T)

df <- data.frame(
  event = 1:100,
  id1 = ids[,1],
  id2 = ids[,2],
  grp = rep(1:10, each=100), stringsAsFactors=F)

head(df,10)

   event id1 id2 grp
1      1   A   C   1
2      2   D   A   1
3      3   A   D   1
4      4   A   B   1
5      5   A   D   1
6      6   B   C   1
7      7   B   D   1
8      8   B   D   1
9      9   B   D   1
10    10   C   A   1

有一对id(id1和id2)。在一行中它们永远不会相同。有一个名为grp的变量。共有10组。每个组都可以被视为一个单独的数据样本。事件变量从每组1-100开始。

我提出的第一个问题非常简单。在每个组中,对于每一行,是两个id(id1-id2)的组合,与前一行相同,与前一行相反,或者这两个选项都不相同。显然,如果在一组的第100行中存在A-C组合,我对下一组的第1行中是否相反,相同或其他任何内容都不感兴趣。

这是我的临时解决方案:

#Give each id pair and identifier:
df$pair <- paste(pmin(df$id1,df$id2), pmax(df$id1,df$id2))

#For each grp, work out using `lag` if previous row contains same pair of ids, and if they are in same or reversed order:

df.sp <- split(df, df$grp)
df$value <- unlist(lapply(df.sp, function(x) ifelse(x$pair!=lag(x$pair), NA, ifelse(x$id1==lag(x$id1), 1, 0)) ))

这给出了:

head(df,10)
   event id1 id2 grp pair value
1      1   A   C   1  A C    NA
2      2   D   A   1  A D    NA
3      3   A   D   1  A D     0
4      4   A   B   1  A B    NA
5      5   A   D   1  A D    NA
6      6   B   C   1  B C    NA
7      7   B   D   1  B D    NA
8      8   B   D   1  B D     1
9      9   B   D   1  B D     1
10    10   C   A   1  A C    NA

这样做 - 显示0为反转,1为副本,NA为非。

我感兴趣的更复杂的问题如下。在每个组(grp)中,对于每一行,找出它之前在该grp中发生的两个id(该对)的组合。如果他们这样做了,那么返回它们是否处于相同的顺序或相反的顺序,即它们发生的前一次。

结果如下:

   event id1 id2 grp pair value
1      1   A   C   1  A C    NA
2      2   D   A   1  A D    NA
3      3   A   D   1  A D     0
4      4   A   B   1  A B    NA
5      5   A   D   1  A D     1
6      6   B   C   1  B C    NA
7      7   B   D   1  B D    NA
8      8   B   D   1  B D     1
9      9   B   D   1  B D     1
10    10   C   A   1  A C     0

e.g。第10行返回为0,因为先前发生了组合A-C并且顺序相反(第1行)。在第5行a 1返回,因为先前在第3行以相同的顺序发生了A-D.

2 个答案:

答案 0 :(得分:3)

你快到了!第二个问题与第一个问题相同,只是按pairgroup进行分组。我将代码转换为dplyr(尽管我很欣赏将问题保留在base中)的精神。我还删除了第二个ifelse,将其替换为逻辑的数字转换,这应该更高效(有些会更容易阅读)。

df %>% group_by(grp) %>%
    mutate(
        pair = paste(pmin(id1, id2), pmax(id1, id2)),
        prev_row = ifelse(pair != lag(pair), NA, as.numeric(id1 == lag(id1)))
    ) %>%
    group_by(grp, pair) %>%
    mutate(prev_any = ifelse(pair != lag(pair), NA, as.numeric(id1 == lag(id1)))) %>%
    head(10)
# Source: local data frame [10 x 7]
# Groups: grp, pair [5]
#
#    event   id1   id2   grp  pair prev_row prev_any
#    (int) (chr) (chr) (int) (chr)    (dbl)    (dbl)
# 1      1     A     C     1   A C       NA       NA
# 2      2     D     A     1   A D       NA       NA
# 3      3     A     D     1   A D        0        0
# 4      4     A     B     1   A B       NA       NA
# 5      5     A     D     1   A D       NA        1
# 6      6     B     C     1   B C       NA       NA
# 7      7     B     D     1   B D       NA       NA
# 8      8     B     D     1   B D        1        1
# 9      9     B     D     1   B D        1        1
# 10    10     C     A     1   A C       NA        0

答案 1 :(得分:2)

对于这样的分组,过滤和变异任务,我发现dplyr非常有用。以下是我提出如何实现目标的一种方式:

$(function () {

    // When the page loads,Check any radio button is checked, If yes enable submit button
    if ($(".myVehicle:checked").length) {
        $("#mySubmit").prop('disabled', false);
    }

    // When user checks a radio button, Enable submit button
    $(".myVehicle").change(function (e) {
        if ($(this).is(":checked")) {
            $("#mySubmit").prop('disabled', false);
        }
    });

});

在每个组中,您比较ID值并有条件地分配新值列。希望这会有所帮助。