我正在尝试重新编码数据集中的变量。数据杂乱无章,由混合类组成。我想将它们全部整理为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
如果有人能在代码中发现错误,将不胜感激。谢谢。
答案 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.integer
。 x2
上的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'));
}