2

行名と目的の列のデータを一緒に貼り付けようとしています。次のコードを書きましたが、どういうわけか正しく実行する方法が見つかりませんでした。

望ましい出力は次のようになります。 "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"
4

3 に答える 3

5

2 つの主なポイント:

  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" 
于 2013-08-02T22:39:49.697 に答える
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)標準のリサイクル ルールに従いpaste各リスト要素から項目を取得し、それらにsep=",".

rownames(x)引数のリストが適切に出力されるように、リスト構造内にカプセル化することでこれを修正できます。

do.call("paste", c(list(rownames(x)), x[c('f1','f3')], sep=","))
于 2013-08-02T22:52:07.103 に答える
3

do.callまたはは必要ありませんapply:

paste(rownames(x),x[[1]],x[[3]] , sep=",")
[1] "a,1,11" "b,2,22" "c,3,33"
于 2013-08-02T22:51:15.303 に答える