【问题标题】:R: Convert several columns from [1,2] to Boolean [TRUE,FALSE]R:将几列从 [1,2] 转换为布尔值 [TRUE,FALSE]
【发布时间】:2015-07-31 06:38:49
【问题描述】:

我有一个数据框(使用 read.csv 导入),其中包含许多(但不是全部)列,其中包含编码为 1=false、2=true 的布尔数据。

我想将它们全部转换为布尔值。我知道我能做到

data$someCol <- data$someCol == 2

我的问题:

  • 这是最好的方法吗?
  • 是否有另一种方法可以将“1”指定为 FALSE,将“2”指定为 TRUE,其余部分指定为 NA?
  • 我能否以某种方式“批量处理”这样的列,通过 grep 进行选择?

谢谢!

【问题讨论】:

  • 你能展示几行示例数据和预期输出吗?那么,如果所有的列都没有编码为 1 或 2,你想要这些列做什么?
  • 我只想对选定的列进行转换(基于名称)。所有其他列必须保持原样。

标签: r boolean multiple-columns


【解决方案1】:

您可以将不是 1 或 2 的元素转换为 NA,只需使用逻辑条件 df1==2 将其转换为逻辑矩阵,TRUE 为 2,FALSE 为 1,其余的NA

 is.na(df1) <- !(df1==1|df1==2)
 df1==2

对于大型数据集,最好使用lapply 循环遍历列

 df1[] <- lapply(df1, function(x) {x[!x %in% c(1,2)] <- NA
                          x==2})

更新

如果我们只想应用列名以“XX”开头的列子集,grep 可以选择将列子集化,然后在该列子集上循环使用 lapply 并将该列替换为lapply 的输出。

 indx <- grep('^XX', colnames(df2))
 df2[indx] <- lapply(df2[indx], function(x) {x[!x %in% c(1,2)] <- NA
                          x==2}) 

另一种选择是使用来自dplyrmutate_each

 library(dplyr)
 mutate_each(df2, funs((NA^!. %in% 1:2)*.==2), matches('^XX'))

我们选择名称以 XX (matches('^XX')) 开头的列,在 funs 中创建逻辑条件。 . 表示列中的任何元素。

 . %in% 1:2 

给出一个逻辑输出。如果元素是 1 或 2,我们得到TRUE,如果不是FALSE

   (NA^!. %in% 1:2)

我们对TRUE/FALSE的输出取反(!),使TRUE变为FALSE,FALSE变为TRUE,将TRUE值变为NA(NA^!...),从而将不是1或2的值转换为NA和所有其他值到 1。

  *.==2

然后我们将* 与我们从之前的输出中得到的值相乘,这样 NA 值保持为 NA 并且 1 值更改为该位置的值,例如1*2=2。这可以通过.==2 制成逻辑输出。如果值为 2,则返回 TRUE,否则(即 1)返回 FALSE。

使用mutate_each不会改变原来的对象,除非我们给原来的对象名赋值

  df2 <- mutate_each(df2, funs((NA^!. %in% 1:2)*.==2), matches('^XX'))

另一个无需重新分配的选项是使用来自magrittr%&lt;&gt;% 运算符

  library(magrittr)
  df2 %<>%
        mutate_each(funs((NA^!. %in% 1:2)*.==2), matches('^XX'))

数据

 set.seed(24)
 df1 <- as.data.frame(matrix(sample(1:5, 20*5, replace=TRUE), ncol=5))
 df2 <- df1
 colnames(df2)[c(2,4)] <- paste0('XX', 1:2)

【讨论】:

  • 谢谢!这可以解决 NA 问题。我可以将“lapply”限制为 df 中的某些列吗? IE。只有名称以“XX”开头的列(框架中可能有很多,但不是全部)?
  • 谢谢,完美!我使用了对我来说最清楚的第一个选项。
猜你喜欢
  • 1970-01-01
  • 2011-04-27
  • 1970-01-01
  • 2014-03-11
  • 1970-01-01
  • 1970-01-01
  • 2011-12-28
  • 2015-09-18
  • 1970-01-01
相关资源
最近更新 更多