2013-08-02 61 views
2

我試圖將rowname和數據一起粘貼到所需的列中。我寫了下面的代碼,但不知何故無法找到正確的方法。將列值粘貼在一個數據框中

所需的輸出將是:"a,1,11" "b,2,22" "c,3,33"

x = data.frame(cbind(f1 = c(1,2,3), f2 = c(5,6,7), f3=c(11,22,33)), row.names= c('a','b','c')) 
x 
# f1 f2 f3 
# a 1 5 11 
# b 2 6 22 
# c 3 7 33 
do.call("paste", c(rownames(x), x[c('f1','f3')], sep=",")) 
# [1] "a,b,c,1,11" "a,b,c,2,22" "a,b,c,3,33" 

回答

5

兩個要點:

  1. 使用apply,而不是do.call(paste, .)
  2. 使用cbind,而不是在這種情況下c
    • 如果您願意使用c,則需要先要挾行名稱的列表或列,如:c(list(rownames(x)), x)

嘗試以下操作:

apply(cbind(rownames(x), x[c('f1','f3')]), 1, paste, collapse=",") 

     a  b  c 
"a,1,11" "b,2,22" "c,3,33" 
+0

我喜歡這個主意,除了'apply'會要挾data.frame成矩陣..你可以用'do.call(paste,...)'來避免.. – Arun

+0

@Arun,是的,然後粘貼到字符串。沒有數據丟失,即使有因素 –

3

無需要do.callapply

paste(rownames(x),x[[1]],x[[3]] , sep=",") 
[1] "a,1,11" "b,2,22" "c,3,33" 
+0

如果您將列名作爲變量傳遞,您將如何避免使用apply? –

+0

設置'var < - c(「f1」,「f2」)'然後'x [[var [1]]],x [[var [2]]]或者x [[「f1」]] x [[「f2」]] –

+0

真的嗎?如果'var'然後變成'var < - c(「f1」,「f2」,「f3」)'那麼什麼? –

4

do.call指示R將列表c(rownames(x), x[c('f1','f3')])粘貼在一起。但看看你的名單。

> c(rownames(x), x[c('f1','f3')]) 
[[1]] 
[1] "a" 

[[2]] 
[1] "b" 

[[3]] 
[1] "c" 

$f1 
[1] 1 2 3 

$f3 
[1] 11 22 33 

c命令獲取每個參數的元素並將它們連接在一起。這正確地解構x[c('f1','f3')],但也以不需要的方式解構rownames(x)。遵循標準recycling rule,paste然後從每個列表元素中取出一個項目並將它們與sep=","一起打補丁。

您可以通過列表結構裏面封裝rownames(x),使您的參數列表出來妥善解決這個問題:

do.call("paste", c(list(rownames(x)), x[c('f1','f3')], sep=",")) 
+0

+1非常好的解釋。 – Arun