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)
将结构(str)转换为1或0之前的结构
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" ...
答案 0 :(得分:3)
这里的问题是你在两个单独的命令中替换“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
答案 1 :(得分:1)
谢谢大家。 R.Schifini的代码解决了我的问题
df = data.frame(ifelse(df=="N",0L,1L))
答案 2 :(得分:0)
您可以通过多种不同方式执行此操作,但这是使用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
的示例。
vars()
https://regex101.com/r/d0dD0w/3很不错,因为您可以使用这些dplyr::mutate_at
中的任何一个在第一个"Y"
参数中轻松指定要操作的列。然后,您可以使用select helpers在第二个"N"
参数中清楚地将funs()
和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
更改为二进制。
df %>% mutate_if(is.character, funs(recode(., "Y" = 1L, "N" = 0L)))
给出相同结果的另一个选项是使用dplyr::recode
来选择要使用谓词函数进行操作的列。这可能对您的情况更有帮助。这里只重新编码字符变量。
dns: 1.2.3.4