【问题标题】:Apply a dataframe of boolean values onto another dataframe in R将布尔值的数据帧应用于 R 中的另一个数据帧
【发布时间】:2017-01-19 00:16:13
【问题描述】:

我有一个这样的数据框:

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

我有一个 bool 值的数据框:

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

(实际上这些东西是 a different post 的结果,但这并不相关,因为这是一个独立的问题)

我只是在寻找一种将带有布尔值的 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")

【问题讨论】:

  • 您是否希望输出中出现这些空白值?
  • 空白或NA或任何方便的...
  • df$x &lt;- ifelse(mask$x, df$x, ""); df$y &lt;- ifelse(mask$y, df$y, "") 将在这个简单的情况下工作
  • @SymbolixAU 这是一个非常好的方法。我应该想到那个tttt...
  • 你不是已经在之前的帖子中得到答案了吗?这个问题有什么不同?

标签: r dataframe


【解决方案1】:

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

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"

几个ifelses 也可以工作

df$x <- ifelse(mask$x, df$x, "")
df$y <- ifelse(mask$y, df$y, "")

【讨论】:

  • 您甚至不必先将df 显式转换为矩阵-replace(df, as.matrix(mask), NA),相当于df[as.matrix(mask)] &lt;- NA
  • @thelatemail - 非常好 - 我大部分时间都在使用 data.table,而我经常忘记 base 语法
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    我们可以使用replace

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

    【讨论】:

    • 如果只需要在数据框的某些列中屏蔽值,这是最有用的答案,例如df[,cols.to.mask] &lt;- replace(df[,cols.to.mask], mask, NA).
    猜你喜欢
    • 2022-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 2016-09-15
    • 1970-01-01
    相关资源
    最近更新 更多