按列值对 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] <- -1
和df[df == FALSE] <- 0
的东西吗?
我在某个地方看到过,我试过了,但是当我这样做时,它会将整个数据帧重新分配为单个逻辑值。我不知道我做错了什么?
实际上,@MartinGal,我刚刚意识到我在做 df
看看@blob 的回答。 dplyr
的across
函数对于此类任务来说是一个非常强大的工具。
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 数据框进行子集,并将与特定值匹配的单元格更改为新值的主要内容,如果未能解决你的问题,请参考以下文章