0

我正在合并一堆,csv每个 id/pk/seqn 有 1 行。

> full = merge(demo, lab13am, by="seqn", all=TRUE)
> full = merge(full, cdq, by="seqn", all=TRUE)
> full = merge(full, mcq, by="seqn", all=TRUE)
> full = merge(full, cfq, by="seqn", all=TRUE)
> full = merge(full, diq, by="seqn", all=TRUE)
> print(length(full$ridageyr))
[1] 9965
> print(summary(full$ridageyr))
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   0.00   11.00   19.00   29.73   48.00   85.00 

一切都很好。但是,我有另一个文件,每个 id 有多个行,例如:

"seqn","rxd030","rxd240b","nhcode","rxq250"
56,2,"","",NA,NA,""
57,1,"ACETAMINOPHEN","01200",2
57,1,"BUDESONIDE","08800",1
58,1,"99999","",NA

57有两行。所以,如果我天真地尝试合并这个文件,我会有更多的行,我的数据就会全部歪斜。

> full = merge(full, rxq, by="seqn", all=TRUE)
> print(length(full$ridageyr))
[1] 15643
> print(summary(full$ridageyr))
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
   0.00   14.00   41.00   40.28   66.00   85.00 

有没有一种正常的惯用方式来处理这样的数据?例如,假设我想创建一个列,full其中包含参与者在过去 30 天内是否接受了 RX。我可以通过以下方式获取键列表:

has_taken <- unique(rxq[rxq$rxd030 == "1",]$seqn)
hasnt_tak <- unique(rxq[rxq$rxd030 == "2",]$seqn)
full$takenRX <- ifelse(full$seqn %in% has_taken, TRUE, ifelse(full$seqn %in% hasnt_tak, FALSE, NA))

现在我有一takenRX列我认为正确地为我的full数据框中的每一行给出了 TRUE/FALSE/NA。我是否需要为每一位数据手动执行类似的操作,或者是否有更自动化的方式可以将每个键的多行数据带入我的数据框中?有没有更优雅的建议?更惯用的方法?

对于其他列,我想我想组合这些行以便有〜元组。

key, a, b, c
2, 0, 0, 0

key, baz
2, foo
2, bar

给了我类似的东西:

key, a, b, c, baz
2, 0, 0, 0, [foo, bar]

但是,我不确定要使用什么数据结构,[foo, bar]所以我可以在以后轻松地使用“has foo in baz”作为逻辑。

在家玩,这里有/有一些代码

4

1 回答 1

3

对于您更新的示例:

demog <- data.frame(key=c(2, 3), a=c(1,0), b=letters[1:2], c=LETTERS[1:2])
meds <- data.frame(key=c(2,2), baz=c('foo', 'baz'), stringsAsFactors=FALSE)
aggregate(baz~key, data=meds, FUN=list)
#  key      baz
#1   2 foo, baz

merge(demog, mermed)
#  key a b c      baz
#1   2 1 a A foo, baz

如果您不想在没有药物的情况下松动案例,则需要将 all.x=TRUE 添加到真实案例中,我对您的问题的部分批评是缺乏足够大的测试案例来暴露其他此类编码缺陷.

> merge(demog, mermed, all.x=T)
  key a b c      baz
1   2 1 a A foo, baz
2   3 0 b B       NA

(我仍然认为以下内容适用。)您可能需要对感兴趣的药物进行合理的分类,并为每个人级别的记录创建一个单独的记录,说明他们是否从您的研究感兴趣的类别中选择了一个。我想知道那些“rxd030”或“rxq250”代码是否可能是压缩降脂剂的临床分组?(事实证明并非如此。)这表明提问者需要提供含义和代码才能获得明智的建议。

一些搜索表明这可能已经完成。这是 NHANES 1999-2000 药物网页的一小部分:

Codebook

    SEQN - Respondent sequence number
    RXD030 - Taken prescription medicine/past month
    RXD240B - Standard generic ingredient name
    NHCODE - Standard generic ingredient code
    RXQ250 - Medicine container seen by interviewer
    RXD260 - Number of days taken medicine
    FDACODE1 - FDA/NDC drug class code 1 
    FDACODE2 - FDA/NDC drug class code 2
    FDACODE3 - FDA/NDC drug class code 3
    FDACODE4 - FDA/NDC drug class code 4
    FDACODE5 - FDA/NDC drug class code 5
    FDACODE6 - FDA/NDC drug class code 6

还有一个附录有一些计数:

Code or Value   Value Description   Count   Cumulative  Skip to Item
Generic drug code   Value was recorded  9138     9138   
        < blank >   Missing             6505    15643 

其中一个医学代码是:912 HYPERLIPIDEMIA

所以看起来你不需要重新发明轮子,而是可以使用已经完成的分类。

您首先需要根据“RXD030:您在过去一个月内服用或使用过任何处方药吗?”创建一个变量。每个类别的“否”案例都将为 0。

我将数据导入 R 并查看了“高脂血症药物”。事实证明,只有 FDACODE1 和 FDACODE2 用于“0912”类别。这是匹配的两个代码的前十个 SEQN。我提供这个是为了帮助您构建一个正确的问题:

> subset( medrecs,  FDACODE2 %in% "0912" )[1:10,"SEQN"]
 [1]   46   86   90  191  434 1029 1273 1634 1980 2105
> subset( medrecs,  FDACODE1 %in% "0912" )[1:10,"SEQN"]
 [1]  29  55  86 130 148 179 187 211 239 274

一个适当的问题将提供对部分或全部这些的所有医学记录的访问,以及一些没有它们的样本医学记录,并且将有“demog”记录匹配。

于 2012-07-07T03:11:30.387 回答