根据掩码选择数据帧中的观测值

时间:2018-02-20 11:00:24

标签: r dataframe

如何根据另一个指定遮罩的数据框在数据框中选择观察?

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 **

2 个答案:

答案 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)