将列值粘贴在数据框中

时间:2013-08-02 22:37:13

标签: r

我正在尝试将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"

3 个答案:

答案 0 :(得分:5)

两个要点:

  1. 使用apply代替do.call(paste, .)
  2. 在这种情况下,请使用cbind代替c
    • 如果您更愿意使用c,则需要先将行名称强制转换为列表或列,例如:c(list(rownames(x)), x)
  3. 尝试以下方法:

     apply(cbind(rownames(x), x[c('f1','f3')]), 1, paste, collapse=",")
    
           a        b        c 
    "a,1,11" "b,2,22" "c,3,33" 
    

答案 1 :(得分: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 rulepaste然后从每个列表元素中获取一个项目,并将其与sep=","一起修补。

您可以通过将rownames(x)封装在列表结构中来解决此问题,以便正确地显示您的参数列表:

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

答案 2 :(得分:3)

无需do.callapply

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