2017-05-22 60 views
1

假設我有一個看起來像這樣的數據表:操縱數據幀有一行的所有結果

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

這裏的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 
+1

我剛剛發佈了一個非常類似的解決方案。只有在這裏注意,你可以使用'rownames_to_column()'而不是硬編碼字母。 – Sotos

+0

好的建議。編輯來反映它。 –

0

此外,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 
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 
+0

很好的解決方案!我認爲值得指出的是'c'並沒有真正地結合任何東西。一個等價的方法就是隻用'function(x)x' –

+0

@MikeH。你說得對,爲了清楚起見,用身份函數替換它可能會更好。我編輯了答案。 – Lamia