列未从 chr 更改为数字

Column not changing to numeric from chr

house = read.csv("Final dataset.csv",stringsAsFactors = FALSE)
house_bin = house[39:55]
str(house_bin)
house_bin[house_bin == "N"] = as.integer(0)
house_bin[house_bin == "Y"] = as.integer(1)
str(house_bin)
library(polycor)
library(psych)
tetrachoric(house_bin)

我的数据框中有一些分类变量,其值为 "Y" 或 "N"。如上所示,我将它们更改为二进制(1 和 0)。但是数据或列的数据类型仍然是chr.

我尝试使用以下方法将其更改为数字,但没有成功!

house_bin = as.numeric(house_bin)
house_bin = as.numeric(as.character(house_bin))
house_bin = (as.numeric(unlist(house_bin)))
house_bin = apply(house_bin,2,as.numeric)

将它们变为 1 或 0 之前的结构 (str)

str(house_bin)
'data.frame':   5764 obs. of  17 variables:
 $ Mobile.Home.Indicator                    : chr  "N" "N" "Y" "N" ...
 $ Single.Parent                            : chr  "N" "N" "N" "N" ...
 $ Fireplace.in.Home                        : chr  "N" "Y" "Y" "N" ...
 $ Pool.Owner                               : chr  "N" "N" "N" "Y" ...

将它们转为1或0后的结构(str)

str(house_bin)
'data.frame':   5764 obs. of  17 variables:
 $ Mobile.Home.Indicator                    : chr  "0" "0" "1" "0" ...
 $ Single.Parent                            : chr  "0" "0" "0" "0" ...
 $ Fireplace.in.Home                        : chr  "0" "1" "1" "0" ...
 $ Pool.Owner                               : chr  "0" "0" "0" "1" ...

您可以通过多种不同的方式执行此操作,但这里有一个使用 dplyr 的示例。

创建数据

library(dplyr)

df <- tibble(a = sample(c("Y", "N"), 10, replace = TRUE),
             b = sample(c("Y", "N"), 10, replace = TRUE),
             c = sample(c("Y", "N"), 10, replace = TRUE))
df

#> # A tibble: 10 x 3
#>        a     b     c
#>    <chr> <chr> <chr>
#>  1     Y     Y     Y
#>  2     Y     N     N
#>  3     Y     N     Y
#>  4     Y     Y     Y
#>  5     Y     Y     Y
#>  6     Y     Y     N
#>  7     Y     N     N
#>  8     Y     N     N
#>  9     N     N     Y
#> 10     Y     Y     N

将字符重新编码为数字

dplyr::mutate_at is nice because you can specify which columns to operate on easily in the first vars() argument with any of these select helpers. Then you can use dplyr::recode 以在第二个 funs() 参数中将 "Y""N" 明确更改为二进制。

df %>% mutate_at(vars(a, b, c), funs(recode(., "Y" = 1L, "N" = 0L)))

#> # A tibble: 10 x 3
#>        a     b     c
#>    <int> <int> <int>
#>  1     0     0     0
#>  2     0     0     0
#>  3     0     0     1
#>  4     1     0     0
#>  5     1     0     1
#>  6     1     0     1
#>  7     1     1     1
#>  8     1     1     0
#>  9     0     0     0
#> 10     0     0     0

另一个给出相同结果的选项是使用 dplyr::mutate_if 到 select 列来使用谓词函数进行操作。这可能对您的情况更有帮助。这里只重新编码字符变量。

df %>% mutate_if(is.character, funs(recode(., "Y" = 1L, "N" = 0L)))

这里的问题是您在两个单独的命令中替换了 "N" 和 "Y"。当第一个被替换(N 代表 0L)时,0L 被转换为字符,因为 "Y" 个字符仍然存在。

一种方法是使用 ifelse。让我们举个例子:

df = data.frame(c = c("N","Y"),d = c("Y","N"),stringsAsFactors = F)

> df
  c d
1 N Y
2 Y N

> str(df)
'data.frame':   2 obs. of  2 variables:
 $ c: chr  "N" "Y"
 $ d: chr  "Y" "N"

使用ifelse

df = data.frame(ifelse(df=="N",0L,1L))

结果:

> df
  c d
1 0 1
2 1 0

> str(df)
'data.frame':   2 obs. of  2 variables:
 $ c: int  0 1
 $ d: int  1 0

谢谢大家。来自 R.Schifini 的代码解决了我的问题

df = data.frame(ifelse(df=="N",0L,1L))