r - 按条件填充数据框列中的空值
问题描述
我有以下数据框。现在我想通过确定代码44和90的值来填充“产品”中的空值。44应该是“衬衫”和90“毛衣”。
最好的方法是什么?用for循环?
data = data.frame("code" = c(44,78,21,90,100,44,90), "product" = c("","hat","shoe","","umbrella","",""))
> data
code product
1 44
2 78 hat
3 21 shoe
4 90
5 100 umbrella
6 44
7 90
解决方案
使用dplyr
首先将产品变量转换为字符(来自因子),然后使用case_when
library(dplyr)
data %>%
mutate_if(is.factor, as.character) %>%
mutate(product = case_when(product == "" & code == 44 ~ "shirt",
product == "" & code == 90 ~ "sweater",
TRUE ~ product))
code product
1 44 shirt
2 78 hat
3 21 shoe
4 90 sweater
5 100 umbrella
6 44 shirt
7 90 sweater
使用base
相同的想法 - 首先将因子转换为字符然后使用 ifelse
i <- sapply(data, is.factor)
data[i] <- lapply(data[i], as.character)
data$product[data$product == ""] <- ifelse(data$code[data$product == ""] == 44, "shirt", "sweater")
data
code product
1 44 shirt
2 78 hat
3 21 shoe
4 90 sweater
5 100 umbrella
6 44 shirt
7 90 sweater
另外值得注意的是,如果您使用data.frame
所有stringsAsFactors = FALSE
因子转换变得不必要。
推荐阅读
- laravel-5 - Laravel 命令“__construct”有一个参数,但它来自哪里?
- javascript - 从对象数组中删除空条目
- python - concurrent.futures:同时运行多个任务
- c# - 使用视图将过滤器属性设置为所有控制器方法
- reactjs - 使用 JSX 渲染引导组件
- java - In Java, how can I return two different types based on an argument?
- common-lisp - 为什么 (find-if #'consp '('notdefinedsymbol)) => 'NOTDEFINEDSYMBOL?
- python - 全面设置matplotlib字体参数
- jupyter-notebook - 是否可以在 JupyerNotebook 中播放视频作为功能返回?
- mysql - 将嵌套子查询转换为连接