Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
确定前一行的值是否在dataframe中重复_R - Fatal编程技术网

确定前一行的值是否在dataframe中重复

确定前一行的值是否在dataframe中重复,r,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 id

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

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
   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
这是有效的-显示0为反转,1为副本,NA为两者都不是

我感兴趣的更复杂的问题如下。在每个组(grp)中,对于每一行,查找其两个ID(该对)的组合以前是否出现在该grp中。如果是,则返回它们与上一次发生时的顺序是否相同或相反

结果如下所示:

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
   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作为a-D返回,之前在第3行中以相同的顺序出现。

对于此类分组、筛选和变异任务,我发现dplyr非常有用。以下是我提出的一种方法,你可以实现你的目标:

df %>% group_by(grp) %>% mutate(value = ifelse(id1 == lag(id1) & id2 == lag(id2), 1, ifelse(id1 == lag(id2) & id2 == lag(id1), 0, NA)))

在每个组中,比较ID值并有条件地指定一个新的值列。希望这有帮助。

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


谢谢是的,我实际上是用dplyr和purr做的,但没有在问题中使用它(有些人不喜欢
%>%
——我不知道为什么,我觉得它很棒)。然而,我正在寻找一个更一般化的解决方案来解决这篇文章底部的问题。
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