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行中的3TRUE
s给出一个包含3列的输出矩阵。让我问你:如果第1行的掩码中只有一个TRUE
,会发生什么?预期的输出会是什么样子?很抱歉,我忘了指定true和false的数量始终为3和1为什么不将行作为数字向量存储在列表中?您介意解释一下为什么这是糟糕的数据设计吗?例如,输出的列数似乎由第一行中TRUE
s的数量决定:第1行中的3TRUE
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来“污染”它。