【问题标题】:merge with multiple tables与多个表合并
【发布时间】:2013-06-04 21:17:06
【问题描述】:

我在重塑数据时遇到问题;以下是我拥有的示例数据集。

x<-data.frame(SN=rep(1:4,c(3,3,4,4)),value=1:14,F=rep(c(LETTERS[1:4]), each = 1, len =  14))

我需要使用包含唯一 SN 数据的列重新创建数据,然后在“值”中分配具有该 SN 的列名称以识别 SN。最后,我需要将它们合并在一起。

我想要以下输出:

F   1   2   3   4    
A   1   5   9   13
B   2   6   10  14
C   3   NA  7   11
D   NA  4   8   12

我的数据结构是:

SN : Chr "1.1", 100.1", "100.5" ...
F:  Factor w/24 levels ...
value: num ...

感谢您的帮助!

【问题讨论】:

  • 这两个示例都不会生成错误,但都会由于列名重复而生成警告。您能否准确描述您的预期输出是什么?
  • @joran 等等,我已经编辑了这个问题。感谢您提供帮助。

标签: r for-loop merge


【解决方案1】:

再次,与其他海报一样,我很不确定您在问什么,但这是我对您尝试做的事情的解释:

require(reshape2)
dcast( x , F ~ SN , value.var = "value" )
#  F 1 2  3  4
#1 A 1 5  9 13
#2 B 2 6 10 14
#3 C 3 0  7 15
#4 D 0 4  8 12

唯一的 SN 是列名,行是 F,值是在值列中找到的对应值。但是,如果 SN-F 组合有多个值(对于 SN = 4 和 F = C,您有 11 和 15),则它采用 max 值。

HTH

【讨论】:

    【解决方案2】:

    我这样做很盲目,只是试图自动化您的手动过程,但我认为它有效。如果你的数据很大,那么肯定有办法提高 make.sub() 函数的速度,但我猜这对你来说不是问题。

    #make funciton to make your subsets
    make.sub <- function(sn){
      tmp <- x[x$SN==sn,]
      names(tmp)[2] <- sn
      return(tmp)
    }
    
    #apply function to get list of subsets
    x.list <- lapply(unique(SN), make.sub)
    
    #merge list of subsets
    x.merged <- Reduce(function(...) merge(..., by="F"), x.list)
    

    如您所见,这与您的手动过程产生的结果相同。

    > x.merged
      F SN.x 1 SN.y 2 SN.x  3 SN.y  4
    1 A    1 1    2 5    3  9    4 13
    2 B    1 2    2 6    3 10    4 14
    > x_all
      F SN.x 1 SN.y 2 SN.x  3 SN.y  4
    1 A    1 1    2 5    3  9    4 13
    2 B    1 2    2 6    3 10    4 14
    

    【讨论】:

    • 改用x.list = split(x, x$SN)
    • 绝对比我写的凌乱函数更干净,但由于我并不真正理解最终目标,我想确保更改第二个变量名称,如手动示例中所示。跨度>
    • @David,它在上述数据集中运行良好。但是当我在我的数据中应用时,它给出了以下错误: fix.by(by.x, x) 中的错误:'by' 必须指定唯一有效的列
    【解决方案3】:

    我不确定我是否得到了你的任务,但我希望这段代码有效:

    x<-data.frame(SN=rep(1:4,c(3,3,4,5)),value=1:15,F=rep(c(LETTERS[1:4]), each = 1, len = 15))
    
    SN<-unique(x$SN)
    for (i in 1:length(SN)){
      xi<-x[x$SN==SN[i],]  
      colnames(xi)[2]<-paste("SN",i,sep=".")
      xi<-xi[,c(3,2)]
      if (i==1){x_all<-xi}
      if (i>1){
      x_all<-merge(x_all,xi,by="F")
      }
    }
    head(x_all)
    

    【讨论】:

    • 感谢您的帮助。很抱歉没有早点说清楚。我在真实数据集中的 SN 不仅是数字;所以在合并之前我不能使用逻辑运算符。
    猜你喜欢
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    • 2015-08-08
    相关资源
    最近更新 更多