用不同类别的变量重新编码数据集

时间:2019-04-03 10:52:31

标签: r

我正在尝试重新编码数据集中的变量。数据杂乱无章,由混合类组成。我想将它们全部整理为1/0的二进制数值变量。我制作了一个简化的示例,如下所示:

我的原始数据由字符(yes / no),逻辑(TRUE / FALSE)和数字(1/0)类别的变量组成。我想将所有内容编码为1/0,并将缺失值也编码为0。

tmp <- data.frame(x1 = c("Yes","Yes","No","No",NA),
                  x2 = c(TRUE, TRUE, FALSE, FALSE, NA),
                  x3 = c(1,1,0,0,NA))
tmp$x1 <- as.character(tmp$x1)

recode.var <- function(x){
      if (is.character(x)) {
      x <- ifelse(x=="Yes",1,ifelse(x=="No",0,ifelse(is.na(x),0,NA)))
    } 
      if (is.logical(x)) {
      x <- ifelse(x==TRUE,1,ifelse(x==FALSE,0,ifelse(is.na(x),0,NA)))
    } 
      if (is.numeric(x)) {
      x <- ifelse(x==1,1,ifelse(x==0,0,ifelse(is.na(x),0,NA))) 
      }
  x <- as.numeric(x)
  return(x)
}
tmp1 <- data.frame(apply(tmp, 2, recode.var))

但是,结果不是我想要的。

> tmp1
  x1 x2 x3
1  1 NA NA
2  1 NA NA
3  0 NA NA
4  0 NA NA
5 NA NA NA

如果有人能在代码中发现错误,将不胜感激。谢谢。

2 个答案:

答案 0 :(得分:0)

我发现您的自定义函数至少存在一个小问题:如果您使用的是ifelse,则需要以is.na条件开始。参见以下示例:

x <- c(1, 2, NA)
ifelse(x == 1, "foo", "bar")
# > [1] "foo" "bar" NA   

这是我做过的选择。 coalesce函数来自dplyr包。

recode.var <- function(x) {
  if (is.character(x)) {
    return(coalesce(as.numeric(x == "Yes"), 0))
  }

  if (is.numeric(x)) {
    return(coalesce(x, 0))
  }

  if (is.logical(x)) {
    return(coalesce(as.numeric(x), 0))
  }

  x
}

我的版本不处理您提到的选项之外的值。我假设它们在您的数据集中不存在,因此不需要考虑它们,但是请告诉我这是否是一个问题。

最后一步是如何将功能应用于数据框。使用dplyr可以使用以下内容:

tmp2 <- mutate_all(tmp, recode.var)

答案 1 :(得分:0)

只需更改as.integerx2上的tmp$x1 <- dplyr::recode(tmp$x1, "Yes" = 1, "No" = 0) tmp$x2 <- as.integer(tmp$x2) tmp[is.na(tmp)] <- 0 tmp x1 x2 x3 1 1 1 1 2 1 1 1 3 0 0 0 4 0 0 0 5 0 0 0 将给出1/0。 我们不能只使用这样的东西吗?

public function startreserve(Request $request){
    $checkbox = $request->input('d');
    foreach ( $request->input('d') as $values){
        $values = explode("-",$values);
        $date[] = $values[0];
        $price[] = $values[1];
    }
    return view('users.properties.reserve',compact('date','price'));
}