我想通过向量对数据框进行子集化,但是为向量中的每个值复制子集:
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
答案 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)])