列未从 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))
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))