【问题标题】:Merge on two criteria, one is a list合并两个条件,一个是列表
【发布时间】:2014-04-26 00:29:41
【问题描述】:

我有两个看起来像这样的数据框。 我们称第一个数据框为“Master”

row ID  Color
1   1   c("blue", "green")
2   1   red
3   2   red
4   3   c("pink", "blue", "purple")

我们称第二个数据框为“Detail”

row ID  Color   Year
1   1   blue    2004
2   1   red     2000
3   1   green   2005
4   2   red     2005
5   3   pink    1999
6   3   brown   2008
7   3   blue    1997
8   3   pink    2007

我想在 Master 中添加一列,当满足两个条件时,该列是 Detail 中年份值的平均值:

  1. ID 匹配(这很简单)
  2. 当在 Master$Color 列表中找到 Detail$Color 时。 (这已被证明是困难的)。

我发现命令...

which(Detail$Color == Master$Color)

...将识别颜色模式,但将该命令应用于合并或应用语句尚未成功。

结果应该是这样的。

row ID  Color                       Mean_Year
1   1   c("blue", "green")          2004.5
2   1   red                         2000
3   2   red                         2005
4   3   c("pink", "blue", "purple") 2001

我的真实数据在 Master 中有 10,000 行,在 Details 中有 8,000,000 行,如果有区别的话。

【问题讨论】:

    标签: r list merge apply


    【解决方案1】:

    我不确定数据框“Master”的数据输入文件是什么样的,但我们假设它包含一个数字向量 (ID) 和一个字符向量 (Color),其中字符向量的每个单元格都包含用逗号分隔的一种或多种颜色。如果你将它导入 R,那么你应该得到一个如下所示的数据框:

    row     ID     Color       
    1       1      "blue, green"    
    2       1      "red"    
    3       2      "red"     
    4       3      "pink, blue, purple"
    

    我意识到这与上面显示的数据框 Master 不同。无论如何,假设您的输入与我刚刚介绍的类似,一旦导入,首先要做的就是去掉向量 master$Color 中的空白

    master$Color<-gsub(" ", "", master$Color)
    

    完成后,做你想做的就相对简单了:

    ID.empty=NULL
    
    for (i in 1:nrow(master)){ID.empty[i]=mean(detail$Year[detail$ID %in% master$ID[i] & is.element(detail$Color, unlist(c(strsplit(master$Color[i],','))))])}
    
    print(ID.empty)
    
    [1] 2004.5 2000.0 2005.0 2001.0
    

    【讨论】:

    • 您的假设通常是正确的,尽管我已将 Master$Color 数据转换为列表。我一直在尝试将您的策略​​转换为这样的应用语句: Master$Mean_Year
    猜你喜欢
    • 1970-01-01
    • 2018-10-08
    • 1970-01-01
    • 2014-01-27
    • 2019-04-03
    • 2014-04-01
    相关资源
    最近更新 更多