使用vec子集数据

时间:2017-05-03 13:41:14

标签: r subset

我想通过向量对数据框进行子集化,但是为向量中的每个值复制子集:

data = data.frame(A = c(1,2,3,1), B = c(1,2,3,4))
vec = c(1, 1, 1)
subset(data, A %in% vec)
  A B
1 1 1
4 1 4

而不是这个结果我想要这个:

  A B
1 1 1
4 1 4
1 1 1
4 1 4
1 1 1
4 1 4

4 个答案:

答案 0 :(得分:2)

如果您使用purrr库,则可以执行

map_df(vec, function(x) subset(data, A == x))
用基数R

,它将是

do.call("rbind", lapply(vec, function(x) subset(data, A == x)))

答案 1 :(得分:2)

你需要扩展它,即

df2 <- subset(data, A %in% vec)
df2[rep(rownames(df2), length(vec)),]
#    A B
#1   1 1
#4   1 4
#1.1 1 1
#4.1 1 4
#1.2 1 1
#4.2 1 4

答案 2 :(得分:2)

data.table的一个选项:

library(data.table)
setDT(data, key = 'A')[.(vec)]
#   A B
#1: 1 1
#2: 1 4
#3: 1 1
#4: 1 4
#5: 1 1
#6: 1 4

或者使用merge,当 merge-by 列中存在重复值时,会根据需要提供笛卡尔产品

merge(data, data.frame(A = vec))

#   A B
#1: 1 1
#2: 1 1
#3: 1 1
#4: 1 4
#5: 1 4
#6: 1 4

答案 3 :(得分:1)

沿着基础R分裂 - 应用 - 组合解决方案的路线

do.call(rbind, lapply(vec, function(i) data[data$A == i, ]))
   A B
1  1 1
4  1 4
11 1 1
41 1 4
12 1 1
42 1 4

如果vec包含不均匀的值混合,这可能很有用。如果vec中有很多重复,这个解决方案可能会很昂贵。在这种情况下,可以通过将其与soto答案中的rep想法相结合来减少计算,如下所示。

# count the number of repetitions by unique value
uni <- table(vec)
# extract unique values
temp <- lapply(as.numeric(names(uni)), function(i) data[data$A == i, ])
# combine results, repeating data.frames according to count
do.call(rbind, temp[rep(seq_along(uni), each=uni)])