基于索引连接(粘贴)元素

时间:2015-10-08 17:54:47

标签: r

我想基于索引连接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

3 个答案:

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

另一种基础R方法: indx&lt; - !(1:nrow(dat)%in%unlist(lapply(indices,'[', - 1))) transform(dat,y = ave(y,cumsum(indx),FUN = toString))[indx,] #x y z #1 1 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:nrow(dat)%in%unlist(lapply(indices,'[', - 1)))出现: 我试图找到一个分组索引。我从最后开始并向后工作。我知道如果我能得到: 1 2 2 3 4 5 5 5 6 7 8 8 9 我可以使用ave并运行toString。我认为需要使用真假组合来使cumsum将上述索引作为输出。我写出来了: cumsum(c(T,T,F,T,T,T,F,F,T,T,T,F,T))  [1] 1 2 2 3 4 5 5 5 6 7 8 8 9 我需要找到一种方法来创建该逻辑索引。如果所有不是第一个的索引列表元素都是假的,那么我将拥有所需的逻辑索引。 unlist(lapply(indices,'[', - 1)) [1] 3 7 8 12 您会注意到这些位置是索引中的所有错误值。 dplyr 我想将dplyr添加到混音中是公平的: dat%&gt;%   mutate(indx = na.omit(c(T,x!= lead(x))))%&gt;%   group_by(ind2 = cumsum(indx))%&gt;%   mutate(y = toString(y))%&gt;%   过滤器(INDX)

答案 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列。如果zx根据这些索引的不同而导致这种情况发生变化,这一点并不明确,这使您可以选择在by unique参数中设置变量data.table

的方法