将dataframe列转换为1或0表示"true"/"false"值并分配给dataframe

dsl*_*rty 27 r type-conversion

在R cli中,我能够在数据框中的字符列上执行以下操作:

> data.frame$column.name [data.frame$column.name == "true"] <- 1
> data.frame$column.name [data.frame$column.name == "false"] <- 0
> data.frame$column.name <- as.integer(data.frame$column.name)
Run Code Online (Sandbox Code Playgroud)

我想这样做是一个函数,我尝试了下面的代码,输入data.frame $ column.name作为arg1.我看到它返回时工作(arg1)但是如何将操作返回到原始data.frame?

boolean.integer <- function(arg1) {
  arg1 [arg1 == "true"] <- 1
  arg1 [arg1 == "false"] <- 0
  arg1 <- as.integer(arg1)
}
Run Code Online (Sandbox Code Playgroud)

dsl*_*rty 37

@chappers解决方案(在评论中)有效 as.integer(as.logical(data.frame$column.name))

  • 这个问题的措辞令人发指,我到这里来寻找相反的内容,因此,如果其他人正在寻找将0和1的列转换为逻辑列,则方法如下:`dataFrame $ columnName = as.logical(dataFrame $ columnName) ` (2认同)

Aja*_*hri 6

你能试试if.else吗

> col2=ifelse(df1$col=="true",1,0)
> df1
$col
[1] "true"  "false"

> cbind(df1$col)
     [,1]   
[1,] "true" 
[2,] "false"
> cbind(df1$col,col2)
             col2
[1,] "true"  "1" 
[2,] "false" "0" 
Run Code Online (Sandbox Code Playgroud)


Eli*_*sEU 6

但是,即使您最终提出了相反的要求,也要将0和1分别转换为True和False,我还是发布了一个答案,关于如何在单个数据框中将整个数据帧中的false和true转换为1和0(1和0)。线。

给出的例子

df <- structure(list(p1_1 = c(TRUE, FALSE, FALSE, NA, TRUE, FALSE, 
                NA), p1_2 = c(FALSE, TRUE, FALSE, NA, FALSE, NA, 
                TRUE), p1_3 = c(TRUE, 
                TRUE, FALSE, NA, NA, FALSE, TRUE), p1_4 = c(FALSE, NA, 
                FALSE,  FALSE, TRUE, FALSE, NA), p1_5 = c(TRUE, NA, 
                FALSE, TRUE, FALSE, NA, TRUE), p1_6 = c(TRUE, NA, 
                FALSE, TRUE, FALSE, NA, TRUE), p1_7 = c(TRUE, NA, 
                FALSE, TRUE, NA, FALSE, TRUE), p1_8 = c(FALSE, 
                FALSE, NA, FALSE, TRUE, FALSE, NA), p1_9 = c(TRUE, 
                FALSE,  NA, FALSE, FALSE, NA, TRUE), p1_10 = c(TRUE, 
                FALSE, NA, FALSE, FALSE, NA, TRUE), p1_11 = c(FALSE, 
                FALSE, NA, FALSE, NA, FALSE, TRUE)), .Names = 
                c("p1_1", "p1_2", "p1_3", "p1_4", "p1_5", "p1_6", 
                "p1_7", "p1_8", "p1_9", "p1_10", "p1_11"), row.names = 
                 c(NA, -7L), class = "data.frame")

   p1_1  p1_2  p1_3  p1_4  p1_5  p1_6  p1_7  p1_8  p1_9 p1_10 p1_11
1  TRUE FALSE  TRUE FALSE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE FALSE
2 FALSE  TRUE  TRUE    NA    NA    NA    NA FALSE FALSE FALSE FALSE
3 FALSE FALSE FALSE FALSE FALSE FALSE FALSE    NA    NA    NA    NA
4    NA    NA    NA FALSE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE
5  TRUE FALSE    NA  TRUE FALSE FALSE    NA  TRUE FALSE FALSE    NA
6 FALSE    NA FALSE FALSE    NA    NA FALSE FALSE    NA    NA FALSE
7    NA  TRUE  TRUE    NA  TRUE  TRUE  TRUE    NA  TRUE  TRUE  TRUE
Run Code Online (Sandbox Code Playgroud)

然后运行该命令:将df * 1所有的False和True转换为1和0。至少,这发生在我拥有的R版本中(R版本3.4.4(2018-03-15))。

> df*1
  p1_1 p1_2 p1_3 p1_4 p1_5 p1_6 p1_7 p1_8 p1_9 p1_10 p1_11
1    1    0    1    0    1    1    1    0    1     1     0
2    0    1    1   NA   NA   NA   NA    0    0     0     0
3    0    0    0    0    0    0    0   NA   NA    NA    NA
4   NA   NA   NA    0    1    1    1    0    0     0     0
5    1    0   NA    1    0    0   NA    1    0     0    NA
6    0   NA    0    0   NA   NA    0    0   NA    NA     0
7   NA    1    1   NA    1    1    1   NA    1     1     1
Run Code Online (Sandbox Code Playgroud)

我不知道在所有不同条件/ dfs下它是否是总的“安全”命令。


And*_*own 6

另一个基本 R 选项是使用+,它将逻辑值转换为整数值(即TRUE = 1FALSE = 0)。在这里,我首先将truefalse值转换为逻辑值(即TRUEFALSE)。

data.frame(sapply(df, \(x) +as.logical(x)))
Run Code Online (Sandbox Code Playgroud)

注意:\(x)只是 的缩写function(x)

输出

  p1_1 p1_2 p1_3 p1_4 p1_5 p1_6 p1_7 p1_8 p1_9 p1_10 p1_11
1    1    0    1    0    1    1    1    0    1     1     0
2    0    1    1   NA   NA   NA   NA    0    0     0     0
Run Code Online (Sandbox Code Playgroud)

整洁宇宙

同样的符号也可以用在mutatefrom中tidyverse

library(tidyverse)

df %>% 
  mutate(across(everything(), ~+as.logical(.x)))
Run Code Online (Sandbox Code Playgroud)

数据

df <- structure(list(p1_1 = c("true", "false"), p1_2 = c("false", "true"
), p1_3 = c("true", "true"), p1_4 = c("false", NA), p1_5 = c("true", 
NA), p1_6 = c("true", NA), p1_7 = c("true", NA), p1_8 = c("false", 
"false"), p1_9 = c("true", "false"), p1_10 = c("true", "false"
), p1_11 = c("false", "false")), row.names = c(NA, -2L), class = "data.frame")

#   p1_1  p1_2 p1_3  p1_4 p1_5 p1_6 p1_7  p1_8  p1_9 p1_10 p1_11
#1  true false true false true true true false  true  true false
#2 false  true true  <NA> <NA> <NA> <NA> false false false false
Run Code Online (Sandbox Code Playgroud)