我有一个数据框(使用read.csv导入),其中包含很多但不是全部的列,这些列的布尔数据编码为1 = false,2 = true。
我想将所有这些转换为布尔值。我知道我可以做到
data$someCol <- data$someCol == 2
我的问题:
谢谢!
答案 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'))