在对列表中的数据帧进行子集化之后,未分割数据帧列表

时间:2014-04-23 09:24:58

标签: r dataframe

假设我有一个数据框“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,列名中的每个元素的行名都是唯一的。

为什么我收到此错误?

1 个答案:

答案 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