我有一些像这样组织的数据:
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.
答案 0 :(得分:3)
你快到了!第二个问题与第一个问题相同,只是按pair
和group
进行分组。我将代码转换为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值并有条件地分配新值列。希望这会有所帮助。