【问题标题】:Manipulating a data frame to have all results in one row操作数据框以将所有结果放在一行中
【发布时间】:2017-05-22 18:48:19
【问题描述】:

假设我有一个如下所示的数据表:

options(stringsAsFactors = F)
letters <- list("A", "B", "C", "D")
numbers <- list(2, 1, 1, 2)
value <- list(.44, .54, .21, .102)
test <- list(.001,.0005, .0004, .01)

DF <- data.frame(cbind(numbers, value, test))
row.names(DF) <- letters


> # DF
  #     numbers   value    test
  # A       2     0.44     0.001
  # B       1     0.54     5e-04
  # C       1     0.21     4e-04
  # D       2     0.102    0.01

我希望数据框的结构如下所示:

DF

A.numbers   A.value   A.test   B.numbers   B.value.   B.test   C.numbers   C.value   C.test   D.numbers   D.value   D.test
2           0.44      0.001    1           0.54       5e-04    1           0.21      4e-04    2           0.102     0.01

我想我需要使用 cbind 或 rbind 但我不确定如何使用!任何方向将不胜感激!

【问题讨论】:

    标签: r dataframe rbind cbind


    【解决方案1】:

    这是一个 tidyverse 解决方案

    library(tidyverse)
    DF %>% 
        rownames_to_column("letters") %>%  
        gather(var, val, -letters) %>% 
        unite(let_var, c(letters, var), sep = ".") %>% 
        spread(let_var, val)
    
    A.numbers A.test A.value B.numbers B.test B.value C.numbers C.test C.value D.numbers D.test D.value
    1         2  0.001    0.44         1  5e-04    0.54         1  4e-04    0.21         2   0.01   0.102
    

    【讨论】:

    • 我正要发布一个非常相似的解决方案。这里只需要注意,你可以使用rownames_to_column()而不是硬编码字母。
    【解决方案2】:

    使用基础 R,您可以:

    d = unlist(apply(DF,1,function(x) x))
    d = data.frame(t(d))
    

    这会返回:

    A.numbers   A.value    A.test B.numbers   B.value    B.test C.numbers   C.value    C.test D.numbers 
       2.0000    0.4400    0.0010    1.0000    0.5400    0.0005    1.0000    0.2100    0.0004    2.0000 
      D.value    D.test 
       0.1020    0.0100 
    

    【讨论】:

    • 不错的解决方案!我认为值得指出c 并没有真正结合任何东西。等效的方法是将行本身与 function(x) x
    • @MikeH。你是对的,为了清楚起见,最好用身份函数替换它。我已经编辑了答案。
    【解决方案3】:

    另外,data.tabledcast 支持转换多个变量,因此您可以尝试:

    DF$names <- row.names(DF)
    res <- data.table::dcast(setDT(DF), .~names, value.var = setdiff(names(DF), "names"), sep = ".")[, .:= NULL]
    
    res
    #   numbers.A numbers.B numbers.C numbers.D value.A value.B value.C value.D test.A test.B test.C test.D
    #1:         2         1         1         2    0.44    0.54    0.21   0.102  0.001  5e-04  4e-04   0.01
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-16
      • 2020-11-27
      • 2021-09-29
      • 2021-06-25
      相关资源
      最近更新 更多