将布尔值的数据帧应用于R中的另一个数据帧

时间:2017-01-19 00:16:14

标签: r dataframe

我有一个数据框:

| x | y |
|---|---|
| a | e |
| b | f |
| c | g |
| d | h |  

我有一个bool值的数据框:

| x     | y     |
|-------|-------|
| FALSE | TRUE  |
| FALSE | TRUE  |
| TRUE  | FALSE |
| TRUE  | FALSE |

(实际上这些内容来自a different post,但这并不是真正相关的因为这是一个独立的问题)

我正在寻找一种方法,将具有bool值的df应用于常规' df,得到这个:

| x | y |
|---|---|
|   | e |
|   | f |
| c |   |
| d |   |

This question提出了一个非常相似的问题,但解决方案分道扬..

我尝试了各种不同的索引方案,但它们都无法保留我想要的输出的矩形结构。

df[mask]太好了,也不是真的。

任何建议都非常感谢。

我的数据:

df <- data.frame(
  x = c('a', 'b', 'c', 'd'),
  y = c('e', 'f', 'g', 'h'), stringsAsFactors = F
)

mask <- structure(list(x = c(FALSE, FALSE, TRUE, TRUE), y = c(TRUE, TRUE, 
FALSE, FALSE)), .Names = c("x", "y"), row.names = c(NA, -4L), class = "data.frame")

3 个答案:

答案 0 :(得分:7)

最简单的方法是(感谢@thelatemail的灵感)

init

哪个有效,因为select UPPER(TO_CHAR(Hire_date,'MONTH')) from employees returns a list of months(containing "2" entries for 'MARCH') SELECT COUNT(EMPLOYEEID) "March Joinees" FROM Employees WHERE UPPER(TO_CHAR(Hire_date,'MONTH')) = 'MARCH'; returns 0 as count 强制df[!mask] <- "" # x y # 1 e # 2 f # 3 c # 4 d 为逻辑矩阵(因此不需要!调用)

mask

一些as.matrix()也可以使用

str(mask)
# 'data.frame': 4 obs. of  2 variables:
#   $ x: logi  FALSE FALSE TRUE TRUE
#   $ y: logi  TRUE TRUE FALSE FALSE

str(!mask)
# logi [1:4, 1:2] TRUE TRUE FALSE FALSE FALSE FALSE ...
# - attr(*, "dimnames")=List of 2
# ..$ : NULL
# ..$ : chr [1:2] "x" "y"

## and
class(!mask)
# "matrix"

答案 1 :(得分:6)

您可以使用mapply遍历列,检查mask中的值:

as.data.frame( mapply(function(x,y) ifelse(y, x, ''), df, mask))
##   x y
## 1   e
## 2   f
## 3 c  
## 4 d  

答案 2 :(得分:4)

我们可以使用replace

replace(df, !mask, "")
#  x y
#1   e
#2   f
#3 c  
#4 d