【问题标题】:How to assign entries in a dataframe to different groups?如何将数据框中的条目分配给不同的组?
【发布时间】:2012-06-20 14:29:58
【问题描述】:

因此,在我的 df 中有一个列,其中包含我为实验测试的所有主题。条目被编码为具有 x 级别的因子。每个主题都经过了两次测试,因此 df 中的每个主题都有两个数据集。这些数据集可以有不同的长度。现在我需要按测试时间(1 或 2)对受试者进行分组,因此我可以将时间作为固定效应包含在我的模型中。我该怎么做?

这是我的小例子 df:

require("stringr")
>Subject<- c("DG_120204", "DG_120204", "DG_120305", "BZ_120407", "BZ_120506", "BZ_120506",     "BZ_120506", "SN_120310", "SN_120412")
s2<- str_extract(Subject, "\\d{6}")
dates<-as.Date(s2, format="%y%m%d") 
df<-data.frame(Subject, dates)


    Subject      dates
1 DG_120204 2012-02-04
2 DG_120204 2012-02-04
3 DG_120305 2012-03-05
4 BZ_120407 2012-04-07
5 BZ_120506 2012-05-06
6 BZ_120506 2012-05-06
7 BZ_120506 2012-05-06
8 SN_120310 2012-03-10
9 SN_120412 2012-04-12

例如,Subject DG 的前 2 个条目来自测试会话 1,第三行是会话 2,第 4 行是主题 BZ 的会话 1,第 5-7 行是会话 2 的 BZ,依此类推.

我的想法是添加另一个因子列 (df$time) 并根据 df$Subject 的级别(以及 df$dates 中的日期值?)用 1 和 2 填充它。但现在我什至没有走那么远。

所以我应该有这样的东西:

    Subject      dates time
1 DG_120204 2012-02-04    1
2 DG_120204 2012-02-04    1
3 DG_120305 2012-03-05    2
4 BZ_120407 2012-04-07    1
5 BZ_120506 2012-05-06    2
6 BZ_120506 2012-05-06    2
7 BZ_120506 2012-05-06    2
8 SN_120310 2012-03-10    1
9 SN_120412 2012-04-12    2

我知道这是另一个非常基本的问题,请多多包涵!我最终会学会的……

【问题讨论】:

  • 也许我只是很密集,但我没有看到日期和时间之间的联系?你怎么知道哪些日期对应于时间 == 1 和时间 == 2?如果您知道这一点,请查看ifelse()transform() 是否整洁。
  • @Chase:我只知道是因为较早的测试日期是第 1 期,而较晚的测试日期是第 2 期。但是,每个科目的日期都不同。我会检查你建议的功能...

标签: r grouping dataframe


【解决方案1】:

您可以为主题添加一列 (目前,它显然只是第一列的子字符串), 然后添加一列指示它是否是新日期(1)或不是(0), 然后只是累积计算日期变化。

df$id <- str_replace(df$Subject, "_.*", "") 
library(plyr)
df <- df[ order(df$Subject), ]
ddply(df, "id", mutate, 
  new  = c(1, dates[-1] != dates[-length(dates)]), 
  time = cumsum(new)
)

#     Subject      dates id new time
# 1 BZ_120407 2012-04-07 BZ   1    1
# 2 BZ_120506 2012-05-06 BZ   1    2
# 3 BZ_120506 2012-05-06 BZ   0    2
# 4 BZ_120506 2012-05-06 BZ   0    2
# 5 DG_120204 2012-02-04 DG   1    1
# 6 DG_120204 2012-02-04 DG   0    1
# 7 DG_120305 2012-03-05 DG   1    2
# 8 SN_120310 2012-03-10 SN   1    1
# 9 SN_120412 2012-04-12 SN   1    2

【讨论】:

  • 谢谢,这正是我想要的!
【解决方案2】:

如果我正确读取了您的数据,则每个唯一的 2 字符标识符都是一个主题,每个唯一的 6 位数字都是差异试验,对吗?如果是这样,这个问题是为colsplit量身定做的。

> cbind(df, colsplit(df$Subject, '_', c('Subject_ID', 'Trial')))
    Subject      dates Subject_ID  Trial
1 DG_120204 2012-02-04         DG 120204
2 DG_120204 2012-02-04         DG 120204
3 DG_120305 2012-03-05         DG 120305
4 BZ_120407 2012-04-07         BZ 120407
5 BZ_120506 2012-05-06         BZ 120506
6 BZ_120506 2012-05-06         BZ 120506
7 BZ_120506 2012-05-06         BZ 120506
8 SN_120310 2012-03-10         SN 120310
9 SN_120412 2012-04-12         SN 120412
> 

现在您已准备好您的主题 ID 和试用号。

【讨论】:

    【解决方案3】:

    split()for 循环的组合可以解决问题:

    require("stringr")
    Subject<- c("DG_120204", "DG_120204", "DG_120305", "BZ_120407", "BZ_120506",
    "BZ_120506", "BZ_120506", "SN_120310", "SN_120412")
    s2 <- str_extract(Subject, "\\d{6}")
    dates<-as.Date(s2, format="%y%m%d") 
    df <- data.frame(Subject, dates)
    
    # Add categorical variable:
    spl <- split(df, f=df$Subject)
    times <- 1:length(spl)
    for(x in seq(along=times)) {
        spl[[x]]$time <- times[x]
    }
    df <- unsplit(spl, f=df$Subject)
    
    # Sort based of 'Subject' column: 
    df <- df[order(df$Subject),]
    > df
        Subject      dates time
    4 BZ_120407 2012-04-07   1
    5 BZ_120506 2012-05-06   2
    6 BZ_120506 2012-05-06   2
    7 BZ_120506 2012-05-06   2
    1 DG_120204 2012-02-04   3
    2 DG_120204 2012-02-04   3
    3 DG_120305 2012-03-05   4
    8 SN_120310 2012-03-10   5
    9 SN_120412 2012-04-12   6
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-23
      • 1970-01-01
      • 1970-01-01
      • 2023-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多