对列表中的数据框进行子集化后取消拆分数据框列表

use*_*376 6 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
Run Code Online (Sandbox Code Playgroud)

然后我对其执行以下操作

> 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
Run Code Online (Sandbox Code Playgroud)

到目前为止工作正常。但是当我这样做时,它给了我一个错误

> 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’
Run Code Online (Sandbox Code Playgroud)

我不明白,因为如果我打印出 x.split2,列表中每个元素的行名称都是唯一的。

为什么我收到这个错误?

A5C*_*2T1 7

代替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
Run Code Online (Sandbox Code Playgroud)

您目前的方法不起作用,因为您的“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
Run Code Online (Sandbox Code Playgroud)