操作数据框以将所有结果放在一行中

时间:2017-05-22 18:48:19

标签: r dataframe rbind cbind

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

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,但我不确定如何!任何方向都将非常感谢!

3 个答案:

答案 0 :(得分:3)

这是一个整齐的解决方案

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

答案 1 :(得分:1)

使用基数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 

答案 2 :(得分:0)

此外,data.table的{​​{1}}支持投放多个变量,因此您可以尝试:

dcast