假设我有一个数据框“x”
> x
x1 x2 x3
1 box 0.81432465 4
2 box 0.19628122 2
3 box 0.06619734 1
4 box 0.90403568 5
5 box 0.52693274 3
6 axe 0.28665840 2
7 axe 0.45193228 3
8 axe 0.48278466 4
9 axe 0.86553847 5
10 axe 0.13925190 1
11 cat 0.86340413 5
12 cat 0.28387540 2
13 cat 0.24297445 1
14 cat 0.36651366 3
15 cat 0.55038108 4
然后我对它执行以下操作
> x.factor <- factor(x[,1]) ## convert column 1 as factors
> x.split <- split(x, x.factor)
> unsplit(x.split, x.factor) ## get back original data frame
到目前为止工作正常。但是当我这样做时,它给了我一个错误
> x.split2 <- lapply(x.split, function(x) {head(x,1)})
> unsplit(x.split2, x.factor) ## trying to combine into a data frame
Error in `row.names<-.data.frame`(`*tmp*`, value = value) :
duplicate 'row.names' are not allowed
In addition: Warning message:
non-unique values when setting 'row.names': ‘1’, ‘11’, ‘6’
我不明白,因为如果我打印出x.split2,列名中的每个元素的行名都是唯一的。
为什么我收到此错误?
答案 0 :(得分:3)
您可以使用常见的unsplit
方法代替do.call(rbind, ...)
:
do.call(rbind, x.split2)
# x1 x2 x3
# axe axe 0.2866584 2
# box box 0.8143246 4
# cat cat 0.8634041 5
您当前的方法不起作用,因为您的“x.factor”对象具有与data.frame
中的原始行数相关的重复值。由于您只是采用了每个因素之一,您还可以尝试以下内容:
unsplit(x.split2, levels(x.factor))
# x1 x2 x3
# 6 axe 0.2866584 2
# 1 box 0.8143246 4
# 11 cat 0.8634041 5