【问题标题】:Truncating a dataframe according to count of vector elements根据向量元素的数量截断数据帧
【发布时间】:2018-11-10 23:56:06
【问题描述】:

我有一个数据框df,包含三个向量:

subject  condition  value
01       A          12
01       A          6
01       B          10
01       B          2
02       A          5
02       A          11
02       B          3
02       B          5
02       B          9
...

主题 01 有四个观测值(因此有四行),其中两个观测值对应于 condition A,两个观测值对应于 condition B。假设由于技术错误,主题 02 有 三个 condition B 观察。

我的问题是:我如何截断 df 以确保每个条件对每个单独的主题只有两个观察值(因此删除错误的第三行 condition==B 为主题 02)?

提前感谢您的帮助!

【问题讨论】:

    标签: r dataframe vector


    【解决方案1】:

    这是dplyr 解决方案 -

    df %>%
      group_by(subject, condition) %>%
      filter(row_number() < 3) %>%
      ungroup()
    
    # A tibble: 8 x 3
      subject condition value
      <chr>   <chr>     <dbl>
    1 01      A            12
    2 01      A             6
    3 01      B            10
    4 01      B             2
    5 02      A             5
    6 02      A            11
    7 02      B             3
    8 02      B             5
    

    【讨论】:

    • 完美,谢谢!顺便说一句,G. Grothendieck 提供的解决方案也有效,但如果数据帧包含 seq = ave() 中未定义的其他向量,则必须修改
    【解决方案2】:

    为每个主题/条件对创建一个序列号 seq 为其行,然后只保留序列号小于 3 的行。

    subset(transform(DF, seq = ave(value, subject, condition, FUN = seq_along)), seq < 3)
    

    给予:

      subject condition value seq
    1      01         A    12   1
    2      01         A     6   2
    3      01         B    10   1
    4      01         B     2   2
    5      02         A     5   1
    6      02         A    11   2
    7      02         B     3   1
    8      02         B     5   2
    

    注意

    假设可重现形式的输入为:

    Lines <- "subject  condition  value
    01       A          12
    01       A          6
    01       B          10
    01       B          2
    02       A          5
    02       A          11
    02       B          3
    02       B          5
    02       B          9"
    DF <- read.table(text = Lines, header = TRUE, strip.white = TRUE,
      colClasses = c("character", "character", "numeric"))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-05
      • 1970-01-01
      • 2021-07-28
      • 1970-01-01
      • 2023-03-30
      相关资源
      最近更新 更多