【问题标题】:R match one long format dataframe to another dataframeR将一个长格式数据帧匹配到另一个数据帧
【发布时间】:2016-11-14 06:05:57
【问题描述】:

我有两个数据框,一个用于匹配,另一个是数据。匹配的是长格式。

  #long format df:

    Person  variable    type    value
1   claire  1   T   0.7396
2   murry   1   C   1.517824
3   kidson  1   T   1.686622
4   kai 1   T   1.4884
5   migu    1   A   1.2769
6   poka    1   G   1.5129
7   nomi    1   C   0.49
8   claire  2   TC  0.86
9   murry   2   CT  1.232
10  kidson  2   CT  1.2987
11  kai 2   CT  1.22
12  migu    2   GA  1.13
13  poka    2   GT  1.23
14  nomi    2   TC  0.7
15  claire  3   C   1
16  murry   3   T   1
17  kidson  3   C   1
18  kai 3   C   1
19  migu    3   G   1
20  poka    3   T   1
21  nomi    3   T   1

lfdf = structure(list(Person = c("claire", "murry", "kidson", "kai", 
"migu", "poka", "nomi", "claire", "murry", "kidson", "kai", "migu", 
"poka", "nomi", "claire", "murry", "kidson", "kai", "migu", "poka", 
"nomi"), variable = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 
2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), type = c("T", "C", 
"T", "T", "A", "G", "C", "TC", "CT", "CT", "CT", "GA", "GT", 
"TC", "C", "T", "C", "C", "G", "T", "T"), value = c(0.7396, 1.517824, 
1.686622, 1.4884, 1.2769, 1.5129, 0.49, 0.86, 1.232, 1.2987, 
1.22, 1.13, 1.23, 0.7, 1, 1, 1, 1, 1, 1, 1)), .Names = c("Person", 
"variable", "type", "value"), class = "data.frame", row.names = c(NA, 
21L))

#df:
Person  SB001   SB002   SB003   SB004
1   claire  C   T   T   TC
2   murry   T   T   T   T
3   kidson  CT  CT  T   T
4   kai C   T   CT  CT
5   migu    G   G   G   GA
6   poka    GT  G   T   T
7   nomi    TC  TC  T   TC

df <- structure(list(Person = c("claire", "murry", "kidson", "kai", 
"migu", "poka", "nomi"), SB001 = c("C", "T", "CT", "C", "G", 
"GT", "TC"), SB002 = c("T", "T", "CT", "T", "G", "G", "TC"), 
SB003 = c("T", "T", "T", "CT", "G", "T", "T"), SB004 = c("TC", 
"T", "T", "CT", "GA", "T", "TC")), .Names = c("Person", "SB001", 
"SB002", "SB003", "SB004"), class = "data.frame", row.names = c(NA, 
7L))

desired output:
    Person  SB001   SB002   SB003   SB004
1   claire  1   0.7396  0.7396  0.86
2   murry   1   1   1   1
3   kidson  1.2987  1.2987  1.686622    1.686622
4   kai 1   1.4884  1.22    1.22
5   migu    1   1   1   1.13
6   poka    1.23    1.5129  1   1
7   nomi    0.7 0.7 1   0.7

我想将类型匹配到另一个数据帧中的值,但是当我把它变成长格式数据帧后,我不知道如何将它匹配到所需的输出。

感谢您的帮助。
有人可以帮忙吗?

【问题讨论】:

    标签: r dataframe merge dplyr


    【解决方案1】:

    我们可以使用reshape2包中的meltdcast来做到这一点,如下所示,

    注意我将名称 valuelfdf 更改为 value1,因为它与 valuemelt 给出的名称重叠

    library(reshape2)
    dcast(merge(melt(df, id.vars = 'Person'), lfdf, by.x = c('value', 'Person'), 
                       by.y = c('type', 'Person')), Person ~ variable.x, value.var = 'value1') 
    
    #  Person  SB001  SB002    SB003    SB004
    #1 claire 1.0000 0.7396 0.739600 0.860000
    #2    kai 1.0000 1.4884 1.220000 1.220000
    #3 kidson 1.2987 1.2987 1.686622 1.686622
    #4   migu 1.0000 1.0000 1.000000 1.130000
    #5  murry 1.0000 1.0000 1.000000 1.000000
    #6   nomi 0.7000 0.7000 1.000000 0.700000
    #7   poka 1.2300 1.5129 1.000000 1.000000
    

    【讨论】:

    • 谢谢,但是如果长格式是宽格式,有什么解决办法?因为以前我认为把它变成长格式更容易做
    • 但现在我认为保持两种宽格式更容易做到?如果两个 df 都是宽格式,你介意告诉我该怎么做吗?
    • 我认为合并长格式数据帧更容易......长格式的变量更少
    • 你是对的,但现在我在想如果数据框有很多列,那么当它转换为长格式时,合并需要时间,对吗?
    • 嗯,是的,但每次扩大规模时都是如此。自己做一些测试。玩一下meltdcast 函数,然后尝试merging 宽格式和长格式...
    【解决方案2】:

    如果您也将df 转换为长格式,则更易于管理。然后你就可以执行查找了。

    您可以使用tidyverse 包:

    df %>%
      gather(Id, value, -Person) %>%
      left_join(lfdf, by= c("Person" = "Person", "value" = "type")) %>%
      select(Person, Id, value.y) %>%
      spread(Id, value.y)
    

    【讨论】:

    • 如果我不把长格式的df改成长格式会更好吗?
    • 没试过,但由于您需要遍历df 中的列,因此以长格式获取这些数据并遍历行更容易。更多信息会有所帮助,例如您有多少列?数据有多大?为什么lfdf 等更喜欢宽格式?
    • @PeterChung ,您始终可以使用 spread 以宽格式获取所有内容。已编辑答案。什么不适合你?请提供详细信息。
    • 如果两者都是宽幅格式,这样做会不会更容易?
    • @PeterChung ,要执行查找,您需要知道需要加入它们的维度(行或列)的名称。由于我们加入了 Personvariables ,因此将它们放在同一维度上会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2021-05-12
    • 2023-03-25
    • 2021-04-03
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    • 2013-02-24
    • 1970-01-01
    相关资源
    最近更新 更多