R 在数据帧中使用lappy/apply查找子集
我有两个数据帧单元和支持(如下所示)。我想要使用以下条件的“cell”的子集:与向量b元素匹配的所有“support”行。我的输出将由所有这些“cell”行组成R 在数据帧中使用lappy/apply查找子集,r,lapply,R,Lapply,我有两个数据帧单元和支持(如下所示)。我想要使用以下条件的“cell”的子集:与向量b元素匹配的所有“support”行。我的输出将由所有这些“cell”行组成 a<-c(0,1,0) b<-c(0,0,1) level = c(3,2,4) zero = c(1,2,1) cell <- do.call(expand.grid, lapply(level, seq)) #create all cell support <- t(apply(cell, 1, f
a<-c(0,1,0)
b<-c(0,0,1)
level = c(3,2,4)
zero = c(1,2,1)
cell <- do.call(expand.grid, lapply(level, seq)) #create all cell
support <- t(apply(cell, 1, function(x) +(x != zero)))
> cell
Var1 Var2 Var3
1 1 1 1
2 2 1 1
3 3 1 1
4 1 2 1
5 2 2 1
6 3 2 1
7 1 1 2
8 2 1 2
9 3 1 2
10 1 2 2
11 2 2 2
12 3 2 2
13 1 1 3
14 2 1 3
15 3 1 3
16 1 2 3
17 2 2 3
18 3 2 3
19 1 1 4
20 2 1 4
21 3 1 4
22 1 2 4
23 2 2 4
24 3 2 4
> support
Var1 Var2 Var3
[1,] 0 1 0
[2,] 1 1 0
[3,] 1 1 0
[4,] 0 0 0
[5,] 1 0 0
[6,] 1 0 0
[7,] 0 1 1
[8,] 1 1 1
[9,] 1 1 1
[10,] 0 0 1
[11,] 1 0 1
[12,] 1 0 1
[13,] 0 1 1
[14,] 1 1 1
[15,] 1 1 1
[16,] 0 0 1
[17,] 1 0 1
[18,] 1 0 1
[19,] 0 1 1
[20,] 1 1 1
[21,] 1 1 1
[22,] 0 0 1
[23,] 1 0 1
[24,] 1 0 1
> hD<-lapply(1:nrow(cell), function (x) cell[which(sum(support[x,]==b)==3),])
> do.call(rbind, hD)
Var1 Var2 Var3
1 1 1 1
2 1 1 1
3 1 1 1
您可以将
b
值与support
中的每一行进行比较,方法是将其转置,然后在单元格中选择所有值都匹配的行
cell[colSums(t(support) == b) == length(b), ]
# Var1 Var2 Var3
#10 1 2 2
#16 1 2 3
#22 1 2 4
也可以使用扫描:
cell[rowSums(sweep(support, 2, b, `==`)) == length(b), ]
要与a
和b
进行比较,我们可以分别匹配它们:
cell[colSums(t(support) == b) == length(b) |
colSums(t(support) == a) == length(a), ]
或者使用lappy
:
cell[Reduce(`|`, lapply(list(a, b), function(x)
colSums(t(support) == x) == length(x))), ]
这是另一个基本的R选项
subset(cell,Reduce(`&`,as.data.frame(t(t(support)==b))))
或
给
Var1 Var2 Var3
10 1 2 2
16 1 2 3
22 1 2 4
这里有一个apply
逻辑,它适用于这两个需求
cell[apply(support, 1, function(x) all(x == b)), ]
# Var1 Var2 Var3
# 10 1 2 2
# 16 1 2 3
# 22 1 2 4
cell[apply(support, 1, function(x) all(x == b) | all(x == a)), ]
# Var1 Var2 Var3
# 1 1 1 1
# 10 1 2 2
# 16 1 2 3
# 22 1 2 4
我们也可以这样做
cell[!rowSums(support != b[col(support)]),]
# Var1 Var2 Var3
#10 1 2 2
#16 1 2 3
#22 1 2 4
如果我再添加一个条件:与向量a和b匹配的所有行。a与第1行匹配。您将如何在代码中添加此条件?@Dihan您可以将这两个条件组合在一起单元格[colSums(t(support)==b)==length(b)| colSums(t(support)==a)==length(a),]
。请参阅更新的答案。yz列和中的H_D(level,zero,yz)错误(support==x):“x”必须是至少两个维度的数组
您能修复此错误吗?当我使用colSums时会发生这种情况。@Dihan的level
和zero
的长度不应该与a
和b
相同吗?那么,您将如何比较这两个变量?yz H_D(level,zero,yz)colSums中的错误(support==x):“x”必须是至少两个维度的数组
您能修复此错误吗?当我使用colSums时会发生这种情况。@Dihan错误似乎与对象结构有关。您是否有向量
或数据帧/矩阵
。在这个例子中,我发现单元格
是data.frame
。如果它是一个向量
,那么您可能会得到这样一个错误。i、 e.v1它可以是向量或数据帧。它适用于数据帧。我尝试了drop=FALSE,但不起作用@正如我所说的,如果它是一个向量
,它将不能与行和
或列和
一起工作。您可以使用创建检查,如果(is.vector(cell)),则执行此操作,否则执行该操作
cell[apply(support, 1, function(x) all(x == b)), ]
# Var1 Var2 Var3
# 10 1 2 2
# 16 1 2 3
# 22 1 2 4
cell[apply(support, 1, function(x) all(x == b) | all(x == a)), ]
# Var1 Var2 Var3
# 1 1 1 1
# 10 1 2 2
# 16 1 2 3
# 22 1 2 4
cell[!rowSums(support != b[col(support)]),]
# Var1 Var2 Var3
#10 1 2 2
#16 1 2 3
#22 1 2 4