列不从chr更改为数字

时间:2017-05-28 03:14:18

标签: r binary character numeric

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" ...

3 个答案:

答案 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