【问题标题】:Subset R dataframe by column values and change cells that match certain value to new value按列值对 R 数据框进行子集,并将与特定值匹配的单元格更改为新值
【发布时间】: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 可能更简单...

标签: r dataframe dplyr subset


【解决方案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)){-1}else{0}
}

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

【讨论】:

  • 你可以用~ .x * -1代替conv.logical
  • 那行得通。我想我毕竟没有仔细看,因为我没有找到cross()。我最终使用了@MartinGal 的评论解决方案,因为它对于我的具体问题更加简洁,但是 cross() 和 conv.logical 函数也可以正常工作。
猜你喜欢
  • 1970-01-01
  • 2021-02-12
  • 1970-01-01
  • 1970-01-01
  • 2014-03-16
  • 2020-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多