r - 删除数据框中每个主题的第一行条件

时间:2018-06-07 11:08:17

标签: r

我有一个长格式数据框,每个主题有多个主题和多个条件。 我想删除所有主题的每个条件的第一行(第一行除外)。 我的数据框看起来像这样:

> df <- data.frame(subj = c(rep(1,4),rep(2,4), rep(3,4)), cond = (rep(c("A", "A", "B", "B"),times=3)), value = round(runif(12, min = 0, max = 10)))
> df
subj cond value
1    A     1
1    A     5
1    B     3
1    B    10
2    A     6
2    A     5
2    B     2
2    B     0
3    A     5
3    A     8
3    B     5
3    B     2

我找到了duplicated()函数,但它只删除了第一个主题的每个条件的第一行:

df <- df[duplicated(df$cond),]
subj cond value
 1    A     5
 1    B    10
 2    A     6
 2    A     5
 2    B     2
 2    B     0
 3    A     5
 3    A     8
 3    B     5
 3    B     2

是否有办法在新主题开始时“重置”重复的发现? 如何阻止它排除第一个条件的第一行?

非常感谢你们!

2 个答案:

答案 0 :(得分:0)

您可以使用两个变量的重复交互进行子集化:

> df
   subj cond value
1     1    A     5
2     1    A     7
3     1    B     4
4     1    B     8
5     2    A     5
6     2    A     2
7     2    B     8
8     2    B     5
9     3    A     8
10    3    A     1
11    3    B     1
12    3    B     5

df1 <- df[!duplicated(interaction(df$subj, df$cond)),]

> df1
   subj cond value
1     1    A     5
3     1    B     4
5     2    A     5
7     2    B     8
9     3    A     8
11    3    B     1

编辑:

我再次阅读了您的问题,似乎您要删除第一行,而不是最后一行。在这种情况下,请使用

df1 <- df[!duplicated(interaction(df$subj, df$cond), fromLast = TRUE),]

> df1
   subj cond value
2     1    A     4
4     1    B     9
6     2    A     9
8     2    B     7
10    3    A     1
12    3    B     2

答案 1 :(得分:0)

替代方案(但取决于实际的df):

df <- data.frame(subj = c(rep(1,4),rep(2,4), rep(3,4)), 
                 cond = (rep(c("A", "A", "B", "B"),times=3)), 
                 value = round(runif(12, min = 0, max = 10)))
df

dummy <- as.character(df$cond) # factor to character
mask <- c(FALSE, dummy[-1] == dummy[-length(dummy)])
df[mask,]