按列值对 R 数据框进行子集,并将与特定值匹配的单元格更改为新值

Posted

技术标签:

【中文标题】按列值对 R 数据框进行子集,并将与特定值匹配的单元格更改为新值【英文标题】:Subset R dataframe by column values and change cells that match certain value to new value 【发布时间】:2021-12-27 02:12:29 【问题描述】:

我有一个需要附加到现有表的单行数据框。事实上,许多数据帧值都是布尔值,但我需要将它们转换为字符串(“-1”表示 TRUE,“0”表示 FALSE)以匹配现有表。由于数据框包含 100 个这样的列,我想避免输入每个单独的列。我尝试过使用 which(TRUE) 和 isTRUE(),但如果它们适用于我的情况,我不确定将什么用作函数参数,或者如何将它们放入数据框中。

我想应该是这样的:

df <- data.frame(a = T, b = F, c = F, d = T, e = T, f = T, g = F, h = F)
df2 <- df[, find all values that are true]$all those columns <- '-1'
df3 <- df2[, find all values that are false]$all those columns <- '0'

## df3 should match this:
df3 <- data.frame(a = '-1', b = '0', c = '0', d = '-1', e = '-1', f = '0', g = '0', h = '0')

我在 dplyr 文档、本网站和谷歌搜索中进行了相当彻底的搜索,发现了很多类似的问题,但没有一个完全符合我的情况。谢谢!

【问题讨论】:

您在寻找类似df[df == TRUE] &lt;- -1df[df == FALSE] &lt;- 0 的东西吗? 我在某个地方看到过,我试过了,但是当我这样做时,它会将整个数据帧重新分配为单个逻辑值。我不知道我做错了什么? 实际上,@MartinGal,我刚刚意识到我在做 df 看看@blob 的回答。 dplyracross 函数对于此类任务来说是一个非常强大的工具。 df[1,] * -1 可能更简单... 【参考方案1】:

您是否尝试过使用across() 逻辑列?下面是一个示例,其中我添加了一个带有数值的列,并使用一个函数仅改变带有across() 的逻辑列。

df <- data.frame(a = T, b = F, c = F, d = T, e = T, f = T, g = F, h = F, non.logical.column = 1)

conv.logical <- function(x)
  if(isTRUE(x))-1else0


df <- df %>% mutate(across(where(is_logical), conv.logical))

【讨论】:

你可以用~ .x * -1代替conv.logical 那行得通。我想我毕竟没有仔细看,因为我没有找到cross()。我最终使用了@MartinGal 的评论解决方案,因为它对于我的具体问题更加简洁,但是 cross() 和 conv.logical 函数也可以正常工作。

以上是关于按列值对 R 数据框进行子集,并将与特定值匹配的单元格更改为新值的主要内容,如果未能解决你的问题,请参考以下文章

如何按列值对二维数组进行排序?

按列值对 MySQL 表进行分区

如何在 Pandas 数据框中按列值分组

数据框按列值过滤行

如果数据框列值匹配字典键,检查不同的列是不是匹配字典值

按列值将数据框拆分为两个[重复]