R 基于掩码在数据帧中选择观测值

R 基于掩码在数据帧中选择观测值,r,dataframe,R,Dataframe,如何基于另一个指定掩码的数据帧选择数据帧中的观测值 例如 原始数据: > df V1 V2 V3 V4 1 3 3 10 5 2 4 2 3 6 3 6 7 7 5 面具: > mask_df V1 V2 V3 V4 1 TRUE TRUE TRUE FALSE 2 TRUE FALSE TRUE TRUE 3 FALSE TRUE TRUE TRUE 预期产出: V1 V2 V3 1

如何基于另一个指定掩码的数据帧选择数据帧中的观测值

例如

原始数据:

> df
   V1 V2 V3 V4
1   3  3 10  5
2   4  2  3  6
3   6  7  7  5
面具:

> mask_df
      V1    V2    V3    V4
1   TRUE  TRUE  TRUE FALSE
2   TRUE FALSE  TRUE  TRUE
3  FALSE  TRUE  TRUE  TRUE
预期产出:

  V1 V2 V3
1  3  3 10
2  4  3  6
3  7  7  5
下面是生成原始数据帧和掩码的代码:

#specify rows
rows = 3

#create the original dataframe
df = data.frame(V1 = sample.int(10,size = rows,replace = TRUE), 
                V2 = sample.int(10,size = rows,replace = TRUE),
                V3 = sample.int(10,size = rows,replace = TRUE), 
                V4 = sample.int(10,size = rows,replace = TRUE))

#view df
df

#create the mask dataframe
mask_df = data.frame(V1 = logical(), V2 = logical(), V3 = logical(), V4= logical())

#fill in the mask
for(i in seq(1,rows))
{
  mask_df[i,] = sample( c(TRUE, TRUE, TRUE, FALSE), 4, replace = FALSE)
}

#view the mask
mask_df

#attempt to pass mask to dataframe
reduced_df = df[mask_df]

**编辑:真值的数量保证为3,假值的数量保证为1**

这再现了您的预期结果,但我完全同意@TimBiegeleisen;这似乎是一个糟糕的数据设计和操作

ncol <- sum(df2[1, ] == TRUE);
matrix(unlist(t(df1))[unlist(t(df2))], ncol = ncol, byrow = T);
#     [,1] [,2] [,3]
#[1,]    3    3   10
#[2,]    4    3    6
#[3,]    7    7    5

ncol这再现了你的预期结果,但我完全同意@TimBiegeleisen;这似乎是一个糟糕的数据设计和操作

ncol <- sum(df2[1, ] == TRUE);
matrix(unlist(t(df1))[unlist(t(df2))], ncol = ncol, byrow = T);
#     [,1] [,2] [,3]
#[1,]    3    3   10
#[2,]    4    3    6
#[3,]    7    7    5

ncol这里是另一个想法,使用
mapply
使用不同的输出

mapply(function(x, y) ifelse(y, x, NA), df, mask_df)
这就给了,


注意由于您未使用种子而使用的
示例
函数

这里是另一个使用
mappy
的不同输出的想法

mapply(function(x, y) ifelse(y, x, NA), df, mask_df)
这就给了,



注意由于您使用的
示例
功能没有种子

您为什么需要此功能,因此
掩码df
与您的不同?对我来说,这看起来像是糟糕的数据设计。不幸的是,我无法影响接收数据的方式。如果FALSE的数量不等于行数,会发生什么?您是如何获得预期的输出的?它似乎与您的
mask_df
不一致。他删除
mask_df
中所有具有
FALSE
的值,并将所有内容向右移动。您为什么需要这样做?对我来说,这看起来像是糟糕的数据设计。不幸的是,我无法影响接收数据的方式。如果FALSE的数量不等于行数,会发生什么?您是如何获得预期的输出的?它似乎与您的
mask_df
不一致。他删除
mask_df
中所有具有
FALSE
的值,并将所有内容向右移动。您介意解释一下为什么这是糟糕的数据设计吗?例如,输出的列数似乎由第一行中
TRUE
s的数量决定:第1行中的3
TRUE
s给出一个包含3列的输出矩阵。让我问你:如果第1行的掩码中只有一个
TRUE
,会发生什么?预期的输出会是什么样子?很抱歉,我忘了指定true和false的数量始终为3和1为什么不将行作为数字向量存储在
列表中
?您介意解释一下为什么这是糟糕的数据设计吗?例如,输出的列数似乎由第一行中
TRUE
s的数量决定:第1行中的3
TRUE
s给出一个包含3列的输出矩阵。让我问你:如果第1行的掩码中只有一个
TRUE
,会发生什么?预期的输出结果如何?很抱歉,我忘了指定true和false的数量始终为3,为什么不将行作为数字向量存储在
列表中呢!要获得预期的输出(删除
NA
并向右移动每一行),您可以使用
apply
wich,它将实现
apply(result\u mapply,1L,function(x)x[!is.NA(x)])
@juliennavare,我不想“污染”“这是一个按行
应用的
。我喜欢使用
mapply
!要获得预期的输出(删除
NA
并向右移动每一行),您可以使用
apply
wich,它将实现
apply(result\u mapply,1L,function(x)x[!is.NA(x)])
@juliennavare,我不想用行
apply来“污染”它。