R:将[1,2]中的多个列转换为布尔值[TRUE,FALSE]

时间:2015-07-31 06:38:49

标签: r grep boolean multiple-columns

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

我想将所有这些转换为布尔值。我知道我可以做到

data$someCol <- data$someCol == 2

我的问题:

  • 这是最好的方法吗?
  • 还有另一个我可以指定两个&#34; 1&#34;为FALSE和&#34; 2&#34;为TRUE,其余为NA?
  • 我可以以某种方式&#34;大规模处理&#34;像这样的列,通过grep选择?

谢谢!

1 个答案:

答案 0 :(得分:2)

您可以将非1或2的元素转换为NA,并使用逻辑条件df1==2将其转换为TRUE为2的逻辑矩阵,{{1 }为1,其余为FALSE

NA

对于大型数据集,最好使用 is.na(df1) <- !(df1==1|df1==2) df1==2 循环遍历列

lapply

更新

如果我们只想应用列名称以&#39; XX&#39;开头的列子集, df1[] <- lapply(df1, function(x) {x[!x %in% c(1,2)] <- NA x==2}) 可以选择对列进行子集化,然后使用grep进行循环列的子集,并使用lapply的输出替换该列。

lapply

另一种选择是使用 indx <- grep('^XX', colnames(df2)) df2[indx] <- lapply(df2[indx], function(x) {x[!x %in% c(1,2)] <- NA x==2})

中的mutate_each
dplyr

我们选择名称以XX( library(dplyr) mutate_each(df2, funs((NA^!. %in% 1:2)*.==2), matches('^XX')) )开头的列,在matches('^XX')内创建逻辑条件。 funs表示列中的任何元素。

.

给出逻辑输出。如果元素是1或2,我们得到 . %in% 1:2 ,如果不是TRUE

FALSE

我们否定( (NA^!. %in% 1:2) !的输出,以便TRUE变为FALSE,FALSE变为TRUE,将TRUE值更改为NA(TRUE/FALSE),从而转换为不是1或2到NA,所有其他值都是1。

NA^!...

然后我们将 *.==2 乘以我们从早期输出得到的值,以便NA值保持为NA,1值变为该位置的值,例如, *。这可以通过1*2=2转换为逻辑输出。如果值为2,则返回为TRUE,否则(即1)返回FALSE。

除非我们指定原始对象名称

,否则使用.==2不会更改原始对象
mutate_each

无需将其分配回来的另一个选项是使用 df2 <- mutate_each(df2, funs((NA^!. %in% 1:2)*.==2), matches('^XX')) 中的%<>%运算符

magrittr

数据

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