【问题标题】:Look up data frame with values stored in another data frame查找具有存储在另一个数据框中的值的数据框
【发布时间】:2017-07-10 11:19:39
【问题描述】:

我有 15 个数据框,其中包含一组患者的就诊信息。下面的例子。它们被命名为FA.OFC1、FA.OFC2等。

ID       sex   date        age.yrs   important.var   etc...
xx_111   F     xx.xx.xxxx  x.x       x

我正在生成一个摘要数据框 (sev.scores),其中包含有关患者在所有记录数据中所经历的最严重事件的信息。我已成功使用which.max 函数获取最严重的情节,但现在需要有关该特定情节的更多信息。

我重新创建了数据框的名称,我需要通过在最大返回后粘贴信息来查找以获取其他信息:

max        data frame
8          df2

具体来说,names() 函数为我提供了情节最严重的列的名称(在摘要数据框 sev.scores 中,它还为我提供了有关要查找的数据框的信息:

sev.scores[52:53] <- as.data.frame(cbind(row.names(sev.scores[c(5,8,11,14,17,20,23,26,29,32,35,38,41,44,47,50)]),apply(sev.scores[c(5,8,11,14,17,20,23,26,29,32,35,38,41,44,47,50)],1,function(x) names(sev.scores[c(5,8,11,14,17,20,23,26,29,32,35,38,41,44,47,50)])[which(x==max(x))])))

但是现在我想弄清楚如何告诉 R 获取存储在列中的数据框名称,并在该数据框中搜索第 5 列中的条目。

因此,在上面的示例中,有关最严重事件的信息存储在数据框 2 (df2) 中,我需要从第 5 条记录 (important.var) 中获取信息并将其返回到此摘要数据框。

更新

我现在已将这些 dfs 存储在一个列表中,但在获取我想要的信息时仍然遇到一些问题。

我找到了以下从列表中获取最大值的示例

lapply(L1, function(x) x[which.max(abs(x))])

如何针对列表中所有元素中存在的因素进行调整?

例如类似:

lapply(my_dfs[[all elements]]["factor of interest"], function(x) x[which.max(abs(x))])

【问题讨论】:

    标签: r list dataframe


    【解决方案1】:

    如果我可以建议一种根本不同的方法:将所有 data.frame 连接到 一个 (rbind),并添加一个单独的列来描述原始 data.frame 的性质。为此,有必要知道原始 data.frames 在哪些方面有所不同(例如,按疾病类型;因为我不知道您的数据,所以我的例子还是坚持这个)。

    此外,您需要确保您的数据在tidy data format 中。这是一个很容易满足的要求,因为your data should be in this format anyway!

    然后,一旦您将所有数据都放在一个 data.frame 中,您就可以简单地创建一个摘要,只需为每种疾病类型选择最严重的发作:

    sev_scores = all_data %>%
        group_by(ID) %>%
        filter(row_number() == which.max(FactorOfInterest))
    

    请注意,此代码使用‹dplyr›包。您可以使用不同的包(例如‹data.table›)或基本 R 函数执行等效分析,但我强烈推荐 dplyr:The resulting code is generally easier to understand.

    而不是您的 sev.scores 表,其中包含引用行和 data.frame 名称的列,我在上面创建的 sev_scores 将包含每个患者最严重事件的实际数据身份证。

    【讨论】:

    • 谢谢!我已按照建议合并了 data.frames,但遇到了列名重复的问题。我可以重命名它们,但随后使用 which.max 变得更加复杂,因为不止一个 FactorOfInterest 可以查看有 15 个。有没有一种简洁的方法来解决这个问题(例如,使用像 @ 这样的共享命名约定987654330@, FactorOfInterest2) 或者我会手动连接包含FactorOfInterest 的列,例如which.max(all_data[c(15,30,45,60 ...)]))
    • @SarahAshley 是的,整洁的方法是将所有这些不同的因子列合并为一个,并添加第二列来描述每行对应的 哪个 因子。这可以通过your_data %&gt;% gather(FactorName, FactorValue, ‹list of factor column names here›) 轻松完成。这需要‹tidyr›包,它与‹dplyr›密切相关。
    • 我认为gather 正是我想要的。但是,我尝试使用一列 (record) 收集 FactorOfInterest,该列描述了每行对应的 哪个 因素,并且仍然遇到一些问题。我没有按预期得到按描述列 record 分组的输出。我正在使用以下代码:gathered_data &lt;- gather(my_data, key=record, value = factor, -record) 我也尝试过gathered_data &lt;- gather(my_data, key=record, value = factor, FactorOfInterest)
    • 没关系,我在您链接的整洁数据格式页面中找到了答案。一个很好的资源!
    猜你喜欢
    • 2014-02-18
    • 2021-09-19
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    • 2019-04-04
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    相关资源
    最近更新 更多