让我们说我们有以下矩阵:
x<- as.data.frame(cbind(c("A","A","A","B","B","B","B","B","C","C","C","C","C","D","D","D","D","D"),
c(1,2,3,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5),
c(14,28,42,14,46,64,71,85,14,28,51,84,66,22,38,32,40,42)))
colnames(x)<- c("ID","Visit", "Age")
第一列代表主题ID,第二列代表观察列表,第三列代表每个连续观察的年龄。
根据之前的访问年龄,这是查找年龄错误的访问的最简单方法。 (即在第13行,主题C是66岁,在上次访问时他已经是84或第16行,主题D是32岁,在上次访问时他已经是38岁。)
哪种方法可以突出显示潜在错误并删除第13行和第16行?
我尝试按ID进行汇总,并查看不同访问次数之间的差异,但对我来说似乎很难,因为任何访问都可能发生错误。
答案 0 :(得分:1)
您可以通过过滤掉每个diff(Age)
ID
为负的行来实现。
使用dplyr
包:
library(dplyr)
x %>% group_by(ID) %>% filter(c(0,diff(Age))>=0)
# A tibble: 16 x 3
# Groups: ID [4]
ID Visit Age
<fctr> <fctr> <fctr>
1 A 1 14
2 A 2 28
3 A 3 42
4 B 1 14
5 B 2 46
6 B 3 64
7 B 4 71
8 B 5 85
9 C 1 14
10 C 2 28
11 C 3 51
12 C 4 84
13 D 1 22
14 D 2 38
15 D 4 40
16 D 5 42
答案 1 :(得分:1)
基地R如何?
df <- do.call(rbind.data.frame, lapply(split(x, x$ID), function(w)
w[c(1, which(diff(w[order(w$Visit), "Age"]) > 0) + 1), ]));
df;
# ID Visit Age
#A.1 A 1 14
#A.2 A 2 28
#A.3 A 3 42
#B.4 B 1 14
#B.5 B 2 46
#B.6 B 3 64
#B.7 B 4 71
#B.8 B 5 85
#C.9 C 1 14
#C.10 C 2 28
#C.11 C 3 51
#C.12 C 4 84
#D.14 D 1 22
#D.15 D 2 38
#D.17 D 4 40
#D.18 D 5 42
说明:我们在列dataframe
上拆分ID
,然后按dataframe
对每个Visit
子集进行排序,计算连续Age
值之间的差异,并且仅保持差异所在的那些行> 0(即Age
正在增加); rbind
给出最终dataframe
。
答案 2 :(得分:1)
aggregate()
方法非常简洁
删除坏行
good <- do.call(c, aggregate(Age ~ ID, x, function(z) c(z[1], diff(z)) > 0)$Age)
x[good,]
# ID Visit Age
# 1 A 1 14
# 2 A 2 28
# 3 A 3 42
# 4 B 1 14
# 5 B 2 46
# 6 B 3 64
# 7 B 4 71
# 8 B 5 85
# 9 C 1 14
# 10 C 2 28
# 11 C 3 51
# 12 C 4 84
# 14 D 1 22
# 15 D 2 38
# 17 D 4 40
# 18 D 5 42
这只会突出显示哪些群体存在不一致:
aggregate(Age ~ ID, x, function(z) all(diff(z) > 0))
# ID Age
# 1 A TRUE
# 2 B TRUE
# 3 C FALSE
# 4 D FALSE