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

两个要点:

  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.callor 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 回答