我想基于索引连接data.frame中元素的行(paste
)。我怎样才能有效地做到这一点?使用唯一标识符很容易,但在这里我有索引而不是连接的因素。欢迎所有包装和基础解决方案选择。
indexes <- list(
2:3,
6:8,
11:12
)
dat <- data.frame(
x = c(1, 2, 2, 3, 4, 5, 5, 5, 6, 7, 2, 2, 1),
y = LETTERS[1:13],
z = "PP", stringsAsFactors = FALSE
)
x y z
1 1 A PP
2 2 B PP
3 2 C PP
4 3 D PP
5 4 E PP
6 5 F PP
7 5 G PP
8 5 H PP
9 6 I PP
10 7 J PP
11 2 K PP
12 2 L PP
13 1 M PP
期望的输出:
x y z
1 1 A PP
2 2 B, C PP
3 3 D PP
4 4 E PP
5 5 F, G, H PP
6 6 I PP
7 7 J PP
8 2 K, L PP
9 1 M PP
答案 0 :(得分:5)
这是基础R中的一种可能的解决方案:
dat[sapply(indexes, "[", 1), "y"] <- sapply(indexes, function(i) {
paste(dat[["y"]][i], collapse = ", ")
})
dat[ setdiff( 1:nrow(dat),
setdiff(
unlist(indexes),
sapply(indexes, "[", 1)
)
), ]
x y z
1 1 A PP
2 2 B, C PP
4 3 D PP
5 4 E PP
6 5 F, G, H PP
9 6 I PP
10 7 J PP
11 2 K, L PP
13 1 M PP
答案 1 :(得分:4)
答案 2 :(得分:3)
以下是使用data.table
set
解决方案
library(data.table)
setDT(dat)
for(i in seq_along(indexes)) {
set(dat, i = indexes[[i]], j = 2L, value = dat[indexes[[i]], toString(y)])
}
unique(dat, by = "y")
# x y z
# 1: 1 A PP
# 2: 2 B, C PP
# 3: 3 D PP
# 4: 4 E PP
# 5: 5 F, G, H PP
# 6: 6 I PP
# 7: 7 J PP
# 8: 2 K, L PP
# 9: 1 M PP
这里的想法是仅对indexes
中指定的索引进行操作,同时仅修改y
列。如果z
和x
根据这些索引的不同而导致这种情况发生变化,这一点并不明确,这使您可以选择在by
unique
参数中设置变量data.table