R语言 如何查找具有三个或更少非重复值的列

xwbd5t1u  于 2023-06-03  发布在  其他
关注(0)|答案(2)|浏览(232)

我使用的是MASS包中的波士顿房屋数据集,并使用R中的gam包中的样条。但是,会返回一个错误,代码如下:

library(gam)
library(MASS)
library(tidyverse)

Boston.gam <- gam(medv ~ s(crim) + s(zn) + s(indus) + s(nox) + s(rm) + s(age) + s(dis) + s(rad) + s(tax) + s(ptratio) + s(black) + s(lstat), data = Boston)

错误消息为:

A smoothing variable encountered with 3 or less unique values; at least 4 needed

导致问题的变量是chas,它只有两个值,1和0。
什么是用于确定某列是否具有3个或更少的唯一值以便从样条分析中消除该列的检验?

mbjcgjjk

mbjcgjjk1#

base R

data("Boston", package = "MASS")
head(Boston)
#      crim zn indus chas   nox    rm  age    dis rad tax ptratio  black lstat medv
# 1 0.00632 18  2.31    0 0.538 6.575 65.2 4.0900   1 296    15.3 396.90  4.98 24.0
# 2 0.02731  0  7.07    0 0.469 6.421 78.9 4.9671   2 242    17.8 396.90  9.14 21.6
# 3 0.02729  0  7.07    0 0.469 7.185 61.1 4.9671   2 242    17.8 392.83  4.03 34.7
# 4 0.03237  0  2.18    0 0.458 6.998 45.8 6.0622   3 222    18.7 394.63  2.94 33.4
# 5 0.06905  0  2.18    0 0.458 7.147 54.2 6.0622   3 222    18.7 396.90  5.33 36.2
# 6 0.02985  0  2.18    0 0.458 6.430 58.7 6.0622   3 222    18.7 394.12  5.21 28.7
head(Filter(function(z) length(unique(z)) >= 4, Boston))
#      crim zn indus   nox    rm  age    dis rad tax ptratio  black lstat medv
# 1 0.00632 18  2.31 0.538 6.575 65.2 4.0900   1 296    15.3 396.90  4.98 24.0
# 2 0.02731  0  7.07 0.469 6.421 78.9 4.9671   2 242    17.8 396.90  9.14 21.6
# 3 0.02729  0  7.07 0.469 7.185 61.1 4.9671   2 242    17.8 392.83  4.03 34.7
# 4 0.03237  0  2.18 0.458 6.998 45.8 6.0622   3 222    18.7 394.63  2.94 33.4
# 5 0.06905  0  2.18 0.458 7.147 54.2 6.0622   3 222    18.7 396.90  5.33 36.2
# 6 0.02985  0  2.18 0.458 6.430 58.7 6.0622   3 222    18.7 394.12  5.21 28.7
head(Boston[, sapply(Boston, function(z) length(unique(z)) >= 4)])

dplyr

library(dplyr)
select(Boston, where(~ n_distinct(.) >= 4)) %>%
  head()
### same result
lnvxswe2

lnvxswe22#

这样行吗?
您可以使用dplyr::n_distinct()来执行唯一性检查。

# Number of unique values
n_unique_vals <- map_dbl(Boston, n_distinct)

# Names of columns with >= 4 unique vals
keep <- names(n_unique_vals)[n_unique_vals >= 4]

# Model data
gam_data <- Boston %>%
  dplyr::select(all_of(keep))

相关问题