我正在尝试将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"
答案 0 :(得分:5)
两个要点:
apply
代替do.call(paste, .)
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"
答案 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 rule,paste
然后从每个列表元素中获取一个项目,并将其与sep=","
一起修补。
您可以通过将rownames(x)
封装在列表结构中来解决此问题,以便正确地显示您的参数列表:
do.call("paste", c(list(rownames(x)), x[c('f1','f3')], sep=","))
答案 2 :(得分:3)
无需do.call
或apply
:
paste(rownames(x),x[[1]],x[[3]] , sep=",")
[1] "a,1,11" "b,2,22" "c,3,33"