【问题标题】:Merge data.frame rows with common column values合并具有公共列值的 data.frame 行
【发布时间】:2013-11-06 17:56:53
【问题描述】:

您能否告诉我如何像这样转换数据框:

    tg  qr  loc a1  a2  a3  b1  b2  b3  c1  c2  c3
1   A   1   89  NA  NA  NA  1   2   3   1   2   3
2   A   1   61  1   2   3   NA  NA  NA  1   2   3
3   A   2   38  4   5   6   NA  NA  NA  NA  NA  NA
4   B   1   40  4   5   6   NA  NA  NA  NA  NA  NA
5   B   1   3   NA  NA  NA  NA  NA  NA  4   5   6

进入这个:

    tg  qr  loc a1  a2  a3  b1  b2  b3  c1  c2  c3
1   A   1   15  1   2   3   1   2   3   1   2   3
2   A   2   95  4   5   6   NA  NA  NA  NA  NA  NA
3   B   1   42  4   5   6   NA  NA  NA  4   5   6

函数应该:

  • 将“tg”和“qr”列中具有相同值的所有行合并为一行
  • 合并时,将所有“NA”替换为现有值 - 切勿反方向
  • 通常会有这样的情况,当一个变量出现在被合并的两行中,但它的值总是相等的(那么从哪一行取它就无关紧要了)
  • 'loc' 列值不同,但不相关,甚至可以删除该列

这些示例数据帧的代码是:

df = rbind(c("A","1",floor(runif(1,1,100)),c(NA,NA,NA),c(1,2,3),c(1,2,3)),
           c("A","1",floor(runif(1,1,100)),c(1,2,3),c(NA,NA,NA),c(1,2,3)),
           c("A","2",floor(runif(1,1,100)),c(4,5,6),c(NA,NA,NA),c(NA,NA,NA)),
           c("B","1",floor(runif(1,1,100)),c(4,5,6),c(NA,NA,NA),c(NA,NA,NA)),
           c("B","1",floor(runif(1,1,100)),c(NA,NA,NA),c(NA,NA,NA),c(4,5,6)))
df = as.data.frame(df)
colnames(df) = c("target","query","loc",c("a1","a2","a3"),c("b1","b2","b3"),c("c1","c2","c3"))

df2 = rbind(c("A","1",floor(runif(1,1,100)),c(1,2,3),c(1,2,3),c(1,2,3)),
            c("A","2",floor(runif(1,1,100)),c(4,5,6),c(NA,NA,NA),c(NA,NA,NA)),
            c("B","1",floor(runif(1,1,100)),c(4,5,6),c(NA,NA,NA),c(4,5,6)))
df2 = as.data.frame(df2)
colnames(df2) = c("target","query","loc",c("a1","a2","a3"),c("b1","b2","b3"),c("c1","c2","c3"))

感谢您的支持。

【问题讨论】:

  • What have you tried 到目前为止?
  • merge(df,df2,by=c("target","query"))?
  • @Metrics 不是。我没有df2。我将其发布为我想获得的示例输出。

标签: r merge dataframe


【解决方案1】:

使用na.omit:

library(data.table)
dt = data.table(df)

dt[, lapply(.SD, function(x) na.omit(x)[1]), by = list(target, query)]
#   target query loc a1 a2 a3 b1 b2 b3 c1 c2 c3
#1:      A     1  21  1  2  3  1  2  3  1  2  3
#2:      A     2  71  4  5  6 NA NA NA NA NA NA
#3:      B     1  25  4  5  6 NA NA NA  4  5  6

【讨论】:

    【解决方案2】:

    可能是这样的吗?

    library(data.table)
    dt <- data.table(df)
    dt <- dt[,lapply(.SD, as.numeric), by = c("target","query")]
    dt2 <- dt[,lapply(.SD, mean, na.rm = TRUE), by = c("target","query")]
    dt2[is.na(dt2)] <- NA
    

    dt2

    > dt2
       target query loc a1 a2 a3 b1 b2 b3 c1 c2 c3
    1:      A     1 2.0  1  1  1  1  1  1  1  1  1
    2:      A     2 2.0  2  2  2 NA NA NA NA NA NA
    3:      B     1 2.5  2  2  2 NA NA NA  2  2  2
    

    【讨论】:

    • 这似乎与 OP 想要的不符
    • 感谢您指向数据表。但是,输出与我正在解释的输出不匹配。如果我的某些值是字符串,我想这会有问题?
    • 感谢您指出@eddi,我假设“通常会有这样的情况,当合并的两行中都存在一个变量时,它的值将始终相等(那么没关系从哪一行开始)”意味着我不需要担心这一点。显然我误解了什么。
    • @mjktfw,uniquepasteis.na 的组合应该可以解决问题。它将返回您可以转换回来的字符值。不过,我的脑子里似乎有点乱。
    猜你喜欢
    • 2023-01-12
    • 2019-10-14
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多