将数据框列转换为“真”/“假”值的 1 或 0,并分配给数据框

Posted

技术标签:

【中文标题】将数据框列转换为“真”/“假”值的 1 或 0,并分配给数据框【英文标题】:Convert dataframe column to 1 or 0 for "true"/"false" values and assign to dataframe 【发布时间】:2016-02-29 01:12:47 【问题描述】:

在 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)

我想将其作为一个函数来执行,我尝试了以下代码,将 data.frame$column.name 输入为 arg1。我在 return(arg1) 时看到它正在工作,但是如何将操作返回到原始 data.frame?

boolean.integer <- function(arg1) 
  arg1 [arg1 == "true"] <- 1
  arg1 [arg1 == "false"] <- 0
  arg1 <- as.integer(arg1)

【问题讨论】:

我认为你可以运行as.numeric(data.frame$column.name) 自动将布尔值转换为 1,0,如果它是一个字符串,那还可以,我们将有 as.numeric(data.frame$column.name == "true") 也可以工作。 我确实说过列名是否是布尔变量... @chappers 但事实并非如此。 另外说明...如果您的变量实际上是“true”、“false”而不是任意字符,您可以调用.....as.integer(as.logical(data.frame$column.name)) 【参考方案1】:

@chappers 解决方案(在 cmets 中)工作 as.integer(as.logical(data.frame$column.name))

【讨论】:

我喜欢这个解决方案,因为它可以很好地处理异常,例如as.integer(as.logical(c("true","false","blah"))) 返回[1] 1 0 NA 这个问题的措辞很糟糕,我最终在这里寻找相反的内容,所以如果其他人正在寻找将 0 和 1 的列转换为逻辑列,方法如下:dataFrame$columnName = as.logical(dataFrame$columnName)跨度> 【参考方案2】:

即使您最终提出相反的要求,将 0 和 1 转换为真和假,但是,我发布了一个关于如何将错误和真转换为 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

然后通过运行: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

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

【讨论】:

我很喜欢这个解决方案【参考方案3】:

你可以试试 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" 

【讨论】:

【参考方案4】:

试试这个,它会将 True 转换为 1,将 False 转换为 0:

data.frame$column.name.num  <- as.numeric(data.frame$column.name)

然后你可以根据需要转换成因子:

data.frame$column.name.num.factor <- as .factor(data.frame$column.name.num)

【讨论】:

【参考方案5】:

由于您处理的值无论如何都应该是布尔值,因此只需使用 == 并将逻辑响应转换为 as.integer

df <- data.frame(col = c("true", "true", "false"))
df
#     col
# 1  true
# 2  true
# 3 false
df$col <- as.integer(df$col == "true")
df
#   col
# 1   1
# 2   1
# 3   0

【讨论】:

以上是关于将数据框列转换为“真”/“假”值的 1 或 0,并分配给数据框的主要内容,如果未能解决你的问题,请参考以下文章

二进制异或运算怎么算

CNN 只分类一个变量是真还是假

在c中将布尔结果打印为“假”或“真”的最佳方法?

在c中将布尔结果打印为“假”或“真”的最佳方法?

Ruby:如何将字符串转换为布尔值

如何将数据框列转换为字符串并替换 nans(fillna 不起作用)