如何根据另一个指定遮罩的数据框在数据框中选择观察?
E.g。
原始数据:
> 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]
**编辑:TRUE值的数量保证为3,false的数量保证为1 **
答案 0 :(得分:3)
以下是使用mapply
,
mapply(function(x, y) ifelse(y, x, NA), df, mask_df)
给出,
V1 V2 V3 V4 [1,] 4 10 NA 7 [2,] NA 5 2 5 [3,] 3 NA 3 2
注意 mask_df
与您的不同,因为您使用的sample
功能没有种子
答案 1 :(得分:2)
这再现了你的预期结果,但我完全赞同@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
# Your numeric data
df1 <- read.table(text =
"V1 V2 V3 V4
1 3 3 10 5
2 4 2 3 6
3 6 7 7 5", header = T)
# Your mask data
df2 <- read.table(text =
"V1 V2 V3 V4
1 TRUE TRUE TRUE FALSE
2 TRUE FALSE TRUE TRUE
3 FALSE TRUE TRUE TRUE", header = T)