我有一个表示集群数据的数据框列表。
[[1]]
x y r.value g.value b.value
5 99 56 0.9176471 0.4941176 0.007843137
8 192 136 0.8352941 0.6313725 0.000000000
10 261 64 0.8588235 0.7254902 0.000000000
12 355 379 0.5098039 0.2588235 0.078431373
[[2]]
x y r.value g.value b.value
2 44 325 0.9960784 0.7254902 0.11764706
3 52 65 0.9960784 0.7333333 0.37647059
9 211 25 0.8078431 0.6823529 0.59215686
14 374 281 0.5882353 0.1882353 0.09019608
[[3]]
x y r.value g.value b.value
1 25 68 0.9960784 0.7372549 0.36862745
7 191 398 0.9529412 0.7411765 0.07058824
11 338 125 0.9843137 0.8431373 0.02745098
15 492 395 0.9764706 0.7411765 0.00000000
[[4]]
x y r.value g.value b.value
4 99 250 0.9882353 0.8823529 0.4392157
6 133 252 0.9960784 0.9450980 0.6705882
13 362 372 0.8941176 0.8549020 0.6117647
我想使用像lapply
这样的包装函数将列表中的每个数据帧索引附加到每个数据帧的末尾。我希望输出看起来像:
[[1]]
x y r.value g.value b.value cluster
5 99 56 0.9176471 0.4941176 0.007843137 1
8 192 136 0.8352941 0.6313725 0.000000000 1
10 261 64 0.8588235 0.7254902 0.000000000 1
12 355 379 0.5098039 0.2588235 0.078431373 1
[[2]]
x y r.value g.value b.value cluster
2 44 325 0.9960784 0.7254902 0.11764706 2
3 52 65 0.9960784 0.7333333 0.37647059 2
9 211 25 0.8078431 0.6823529 0.59215686 2
14 374 281 0.5882353 0.1882353 0.09019608 2
[[3]]
x y r.value g.value b.value cluster
1 25 68 0.9960784 0.7372549 0.36862745 3
7 191 398 0.9529412 0.7411765 0.07058824 3
11 338 125 0.9843137 0.8431373 0.02745098 3
15 492 395 0.9764706 0.7411765 0.00000000 3
[[4]]
x y r.value g.value b.value cluster
4 99 250 0.9882353 0.8823529 0.4392157 4
6 133 252 0.9960784 0.9450980 0.6705882 4
13 362 372 0.8941176 0.8549020 0.6117647 4
我尝试了lapply(clusters, function(x) cbind(x,cluster= 1))
,但当然只将值1附加到每个数据帧,而不是值1,2,3,4。我也尝试了lapply(clusters, function(x) {i=1:4; cbind(x,cluster= i)})
我看过建议在另一个stackoverflow页面上,但收到错误:
Error in data.frame(..., check.names = FALSE) :
arguments imply differing number of rows: 3, 4
非常感谢任何帮助。
答案 0 :(得分:2)
也许您可以尝试以下方式:
lapply(seq_along(clusters), function(x) cbind(clusters[[x]], cluster= x))
一个最小的例子:
set.seed(1)
mydf <- data.frame(V1 = rep(c("a", "b", "c"), c(2, 3, 1)),
V2 = rnorm(6))
clusters <- split(mydf, mydf$V1)
clusters
# $a
# V1 V2
# 1 a -0.6264538
# 2 a 0.1836433
#
# $b
# V1 V2
# 3 b -0.8356286
# 4 b 1.5952808
# 5 b 0.3295078
#
# $c
# V1 V2
# 6 c -0.8204684
lapply(seq_along(clusters), function(x) cbind(clusters[[x]], cluster= x))
# [[1]]
# V1 V2 cluster
# 1 a -0.6264538 1
# 2 a 0.1836433 1
#
# [[2]]
# V1 V2 cluster
# 3 b -0.8356286 2
# 4 b 1.5952808 2
# 5 b 0.3295078 2
#
# [[3]]
# V1 V2 cluster
# 6 c -0.8204684 3