确定前一行的值是否在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