【问题标题】:How to convert a table calculated by Permutations into a data frame by pairs in R?如何将由Permutations计算的表格在R中成对转换为数据框?
【发布时间】:2019-11-25 09:27:39
【问题描述】:

我的桌子是这样的:

  ID   feature v1    v2   v3
  1     mpg    
  1     ap     0.8
  1     cs     0.7   0.8
  1     de     0.2   0.6  1.2
  2     A
  2     B      0.5
  2     C      0.3   0.4  

1.逻辑是column Permutations,例如:0.8=mpg+ap, 0.7=mpg+cs, 0.2=mpg+de, 0.6=ap+de, 0.5=A+B

2。 ID是区分两组排列(第一组是mpg,ap,cs,de。第二组是A,B,C)

我想转换成另一种数据框格式,如下所示:

ID  Feature1 Feature2 value
 1     mpg      ap     0.8
 1     mpg      cs     0.7
 1     mpg      de     0.2
 1     ap       cs     0.6
 1     ap       de     0.8
 1     cs       de     1.2
 2     A        B      0.5
 2     A        C      0.3
 2     B        C      0.4

有人建议如何转换这个结构(R>3.6.0)?

【问题讨论】:

  • 请提供一些数据。检查此链接stackoverflow.com/questions/5963269/…如何提供可重现的示例
  • 谢谢,我才意识到
  • 我猜第 4 行和第 5 行的值应该在您的预期输出中交换...

标签: r


【解决方案1】:

对于base R,或许下面的代码可以帮到你:

dfs <- split(df,df$ID)

r <- Reduce(rbind,lapply(seq_along(dfs), function(k) {
  v <- dfs[[k]]; 
  f <- combn(v$"feature",2); 
  data.frame(ID=rep(names(dfs[k]),ncol(f)), Feature1=f[1,], Feature2=f[2,], value=unlist(dfs[[k]][-(1:2)][!is.na(dfs[[k]][-(1:2)])]))}))

屈服:

> r
  ID Feature1 Feature2 value
1  1      mpg       ap   0.8
2  1      mpg       cs   0.7
3  1      mpg       de   0.2
4  1       ap       cs   0.8
5  1       ap       de   0.6
6  1       cs       de   1.2
7  2        A        B   0.5
8  2        A        C   0.3
9  2        B        C   0.4

数据

df <- data.frame(ID = c(1,1,1,1,2,2,2), feature = c("mpg", "ap", "cs", "de", "A", "B", "C"), v1 = c(NA, 0.8,0.7,0.2,NA, 0.5,0.3), v2 = c(NA, NA, 0.8, 0.6, NA, NA, 0.4), v3 = c(NA, NA, NA, 1.2, NA, NA, NA))

【讨论】:

  • 非常感谢,我还有一个问题,如果我有超过100个ID,使用会减少很长时间吗?
  • @Smile 这取决于您按 ID 分类的每个组中有多少行
【解决方案2】:

我能够使用dplyrreshape2 生成您请求的输出。 但是,我相信您应该尝试处理您的数据格式(您从哪里获取这些数据),以便能够编写一些更普遍适用的代码。

  data <- data.frame(ID = c(1,1,1,1,2,2,2), feature = c("mpg", "ap", "cs", "de", "A", "B", "C"), v1 = c(NA, 0.8,0.7,0.2,NA, 0.5,0.3), v2 = c(NA, NA, 0.8, 0.6, NA, NA, 0.4), v3 = c(NA, NA, NA, 1.2, NA, NA, NA))

  data %>% 
    group_by(ID) %>% 
    do({
      dfPermutations <- .
      names(dfPermutations) <- 
        c("ID", "feature1", as.character(dfPermutations$feature[1:(ncol(dfPermutations)-2)]))
      dfPermutations %>% 
        reshape2::melt(id.vars = c("ID", "feature1"), variable.name = "feature2") %>% 
        filter(!is.na(value))
    }) %>% 
    ungroup()

``

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 2021-02-07
    相关资源
    最近更新 更多