Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 在数据帧中使用lappy/apply查找子集_R_Lapply - Fatal编程技术网

R 在数据帧中使用lappy/apply查找子集

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

我有两个数据帧单元和支持(如下所示)。我想要使用以下条件的“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, 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