Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.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 按不同数量的逻辑列筛选数据帧_R_Filter_Dataframe - Fatal编程技术网

R 按不同数量的逻辑列筛选数据帧

R 按不同数量的逻辑列筛选数据帧,r,filter,dataframe,R,Filter,Dataframe,我有一个问题,我肯定有一个优雅的解决方案,我还没有找到 我有一个函数,可以创建一个数据帧,其中包含一组不同的逻辑向量。在函数的末尾,我想合并所有现有的逻辑向量。潜在的名称是已知的,但是有足够的信息表明if语句的各种排列是不可行的 例如,下面的两个数据表。潜在的逻辑向量是“夜”、“宠物”、“上升”,其中1到3个将存在。我希望代码能够可靠地组合存在的任何逻辑向量 我甚至提出了一个列号列表,这些列号和潜在列的名称相匹配,但无法将其带回家 希望这是清楚的,谢谢你的帮助 df1 <- structu

我有一个问题,我肯定有一个优雅的解决方案,我还没有找到

我有一个函数,可以创建一个数据帧,其中包含一组不同的逻辑向量。在函数的末尾,我想合并所有现有的逻辑向量。潜在的名称是已知的,但是有足够的信息表明if语句的各种排列是不可行的

例如,下面的两个数据表。潜在的逻辑向量是“夜”、“宠物”、“上升”,其中1到3个将存在。我希望代码能够可靠地组合存在的任何逻辑向量

我甚至提出了一个列号列表,这些列号和潜在列的名称相匹配,但无法将其带回家

希望这是清楚的,谢谢你的帮助

df1 <- structure(list(hour = structure(c(1123624800, 1123628400, 1123632000, 
1123635600, 1123639200), class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
    night = c(FALSE, FALSE, TRUE, TRUE, TRUE), pet = c(TRUE, 
    TRUE, TRUE, TRUE, TRUE)), .Names = c("hour", "night", "pet"
), row.names = c(NA, 5L), class = "data.frame")

structure(list(hour = structure(c(1123624800, 1123628400, 1123632000, 
1123635600, 1123639200), class = c("POSIXct", "POSIXt"), tzone = "UTC"), 
    night = c(FALSE, FALSE, TRUE, TRUE, TRUE), pet = c(TRUE, 
    TRUE, TRUE, TRUE, TRUE), rising = c(TRUE, TRUE, FALSE, TRUE, 
    FALSE)), .Names = c("hour", "night", "pet", "rising"), row.names = c(NA, 
5L), class = "data.frame")


filters <- c("rising", "pet", "night")
match(filters, names(df))[!is.na(match(filters, names(df)))]
编辑:我将重写这篇文章,希望更清楚。 我有一个数据帧,它最多有三个逻辑向量,其中包含各种数据质量过滤器的标志。例如,三个潜在向量的名称是“夜”、“宠物”、“上升”。数据帧将具有这些向量中的1到3的一些组合。有时它会有“宠物”和“夜”,或者“夜”和“上升”,或者“宠物”和“上升”,或者三者都有

我想返回所有现有逻辑向量都为真的记录。问题是,我事先不知道存在哪些向量(这取决于函数调用中的选项),因此我希望编写代码,以便能够处理所有不同的组合。比如:

check which logical vectors exist
return(df[(all existing vectors are true), ]
如果我试试看

return(df[df$rising & df$pet $ df$night, ]) 
只要其中一列丢失,代码就会失败,因此我需要一种更健壮的方法来实现这一点

希望这更清楚!一般来说,如果我不能清楚地表达问题,这意味着我在做一些愚蠢的事情…

更新:

df2[Reduce(`&`, df2[sapply(df2, is.logical)]),]
将返回所有逻辑列均为
TRUE
的行。您还可以使用后面介绍的
apply
方法


您可以通过
减少
&
来实现您的目标:

df1[Reduce(`&`, df1[-1]),]
#                  hour night  pet
# 3 2005-08-10 00:00:00  TRUE TRUE
# 4 2005-08-10 01:00:00  TRUE TRUE
# 5 2005-08-10 02:00:00  TRUE TRUE
上面我们排除了带有
-1
的第一列。下面我们使用您在
过滤器中定义的列列表:

df2[Reduce(`&`, df2[filters]),]
#                  hour night  pet rising
# 4 2005-08-10 01:00:00  TRUE TRUE   TRUE 
Reduce
迭代地将
&
应用于其第二个参数(数据框中的列)中的元素对

或者,您可以使用
应用

df2[apply(df2[filters], 1, all),]
df1[apply(df1[-1], 1, all),]

假设第二个
结构
是,比如说,
df2
,您希望构建一个新的
data.frame
,它将来自其他两个数据帧中匹配列的所有值组合在一起(如果是这样,您希望对可能产生的
NA
做些什么?或者,您想要一个组合向量的命名列表吗?您希望作为结果的样本会有所帮助。第一个解决方案(不包括第一列)工作正常,但我无法让第二个正常工作。然而,由于这将是用户调用的功能,我希望有一种更可靠的方法来识别现有的列。我已经编辑了我的问题,以使其更清楚。谢谢你的帮助!@IcebergSlim,你能更清楚地说明第二个不工作是什么意思吗?你如何解释它失败了吗?你确定你正在使用的
df2
filter
变量与你问题中的
dput
变量完全相同吗?我建议你清除你的工作区,重新创建
df2
filter
@IcebergSlim,请参阅更新的答案以解决编辑问题。谢谢,这是有效的。如果df是用户传递给函数的过程中已经包含逻辑,这可能是个问题,但我会在函数顶部进行检查。再次感谢,
df2[apply(df2[filters], 1, all),]
df1[apply(df1[-1], 1, all),]