r - R函数没有赋值
问题描述
在此处使用来自 Kaggle 的波士顿住房数据 train.csv 。我尝试编写一个函数,如果该行包含 NA 值或已经为 0,则将 GarageYrBlt 列的值更改为 0,否则为 1。
此列包含建造车库的年份,但缺少值和零。
我对 R 比较陌生,我拼凑了下面的函数来尝试替换本列中的值。
library(tidyverse)
housing_prices <- read_csv('../input/train.csv')
garage <- function(x) {
for (i in 1:length(x)){
if (is.na(x[i])) {
x[i] = 0}
else if (x[i] > 0) {
x[i] = 1}
else x[i]=0}
}
garage(housing_prices$GarageYrBlt)
如果我在函数的最后一个花括号之前放置一个 print(x) 语句,我可以看到逻辑工作正常。但是,它不会将值分配回 GarageYrBlt 列。我知道我在这里遗漏了一些简单的东西。
此外,如果有人知道实现此目的的矢量化方式或一般有任何其他提示,他们将不胜感激。
解决方案
函数返回最后一个值。将x
或return(x)
放在函数的末尾,以便将修改x
后的内容从函数中返回。
garage <- function(x) {
for (i in 1:length(x)) {
if (is.na(x[i])) {
x[i] = 0}
else if (x[i] > 0) {
x[i] = 1
}
else x[i] = 0
}
x
}
然后,如果要分配结果,则需要使用=
or分配它<-
housing_prices$GarageYrBlt = garage(housing_prices$GarageYrBlt)
当然,我们可以使用矢量化ifelse
而不是if
for 循环:
housing_prices$GarageYrBlt = ifelse(is.na(housing_prices$GarageYrBlt), 0,
ifelse(housing_prices$GarageYrBlt > 0, 1, 0))
既然你放了tidyverse
标签,一个更好的方法dplyr
是使用case_when
:
housing_prices %>%
mutate(GarageYrBlt = case_when(
is.na(GarageYrBlt) ~ 0,
GarageYrBlt > 0 ~ 1,
TRUE ~ 0
))
或者,coalesce()
是一个很好dplyr
的填充NA
值的实用程序,所以我们可以这样做
housing_prices %>%
mutate(GarageYrBlt = ifelse(coalesce(GarageYrBlt, 0) > 0, 1, 0))
或者,更有趣的是,我们可以使用默认转换TRUE
为 1 和FALSE
0:
housing_prices %>%
mutate(GarageYrBlt = as.integer(coalesce(GarageYrBlt, 0) > 0))
推荐阅读
- php - 在树枝中访问全局对象
- ios - 如何设置饼图centerText的大小
- ms-word - 获取VSTO外接程序项目中Access数据库的数据
- php - 获取大括号之间的数据
- php - iframe 对象在 Altervista 域上不起作用
- c++ - 'char' 的 C++ [错误] 声明遮蔽了参数。这是什么意思?
- thingsboard - 如何更改 ThingsBoard 的默认 JWT 安全密钥?
- kubernetes - 无法使用 ISTIO 网关和虚拟服务连接到 HTTPS 服务
- ios - React Native:在 XCode 9.2 和 9.4 以及 RN 55.4 上构建 IOS 失败
- priority-web-sdk - 优先级 REST:没有有用的错误