【问题标题】:r - remove first row of condition per subject in dataframer - 删除数据框中每个主题的第一行条件
【发布时间】:2018-06-07 19:44:37
【问题描述】:

我有一个长格式数据框,其中包含多个主题和每个主题的多个条件。 我想为所有主题删除每个条件的第一行(第一个除外)。 我的数据框如下所示:

> 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

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

非常感谢大家!

【问题讨论】:

    标签: r


    【解决方案1】:

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

    > 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
    

    【讨论】:

    • 谢谢,这行得通!为了保留第一个条件的所有行,我使用了以下索引:df1
    【解决方案2】:

    替代方案(但取决于实际 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,]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-24
      • 1970-01-01
      • 1970-01-01
      • 2018-03-20
      • 1970-01-01
      • 2021-11-30
      • 1970-01-01
      相关资源
      最近更新 更多