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

Subset R dataframe by column values and change cells that match certain value to new value

我有一个单行数据框,我需要将其附加到现有 table。实际上,许多数据帧值都是布尔值,但我需要将它们转换为字符串(“-1”表示 TRUE,“0”表示 FALSE)以匹配现有的 table。由于数据框包含 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 文档以及本网站和谷歌搜索中进行了非常彻底的搜索,发现了很多类似的问题,但没有一个与我的情况完全相符。谢谢!

您尝试过使用 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)){-1}else{0}
}

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