【问题标题】:Select values per specific occurrence from data frame in R从 R 中的数据框中选择每个特定事件的值
【发布时间】:2014-10-15 13:57:17
【问题描述】:

我被这个卡住了:

我有一个具有以下属性的数据框:

  • 变量类型(值:“P”、“T”、“I”)
  • 变量 id(主题 id)
  • 可变 RT(反应时间)

看起来像这样:

id    type    rt
1     T       333
1     P       912
1     P       467
1     I       773
1     I       123
...
2     P       125
2     I       843
2     T       121
2     P       982
...

变量type 的顺序对于每个主题是随机的,但每个主题的每种类型的数量相同。我想要的是选择前 2 个 RT 值,其中每个参与者的 type=="P" 然后平均出现次数,这样我就得到所有参与者第一次出现 P 的平均 RT,以及第二次出现 P 的平均值.

到目前为止,假设有 20 个参与者,我想为第一次出现总共提取 20 个 RT,为第二次出现总共 20 个 RT。

我尝试了 tapply、聚合、for 循环和简单的子集,但这些要么平均“太早”要么失败,因为每个主题的顺序是随机的。

【问题讨论】:

  • 这个不是很清楚。在示例数据集中,您是否想要第一个 RT 的 912125 的平均值?
  • @akrun 是的,我想要912125 第一次出现的平均值,然后是476982 第二次出现的平均值,等等......

标签: r subset


【解决方案1】:

试试

 devtools::install_github("hadley/dplyr")
 library(dplyr)
   df%>%
      group_by(id) %>% 
      filter(type=="P") %>% 
      slice(1:2)%>% 
      mutate(N=row_number()) %>%
      group_by(N) %>% 
      summarise(rt=mean(rt))
     #Source: local data frame [2 x 2]

   # N    rt
   #1 1 518.5
   #2 2 724.5

或使用data.table

 library(data.table)
  setDT(df)[type=="P", list(rt=rt[1:2], N=seq_len(.N)), by=id][, 
                                      list(Meanrt=mean(rt)), by=N] 
  #   N Meanrt
  #1: 1  518.5
  #2: 2  724.5

或者使用来自base Raggregate

  df1 <- subset(df, type=="P")
  df1$indx <- with(df1, ave(rt, id, FUN=seq_along))
  aggregate(rt~indx, df1[df1$indx %in% 1:2,], FUN=mean)
  #  indx    rt
  #1    1 518.5
  #2    2 724.5

数据

 df <- structure(list(id = c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), type = c("T", 
 "P", "P", "I", "I", "P", "I", "T", "P"), rt = c(333L, 912L, 467L, 
 773L, 123L, 125L, 843L, 121L, 982L)), .Names = c("id", "type", 
 "rt"), class = "data.frame", row.names = c(NA, -9L))

【讨论】:

  • 太棒了!感谢您的回答和您概述的许多方法。
【解决方案2】:

我希望我做对了,使用 dplyr:

df %>% 
group_by(id, type) %>% 
mutate(occ=1:n()) %>% 
group_by(type, occ) %>% 
summarise(av=mean(rt)) %>%
filter(type=="P")

Source: local data frame [2 x 3]
Groups: type

  type occ    av
1    P   1 518.5
2    P   2 724.5

【讨论】:

    猜你喜欢
    • 2020-10-13
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多