如何解决数据集变量的问题

How to solve problem with dataset's variables

我在尝试 运行 我的回归模型时遇到以下问题:

这两个数据集对 post 它们来说相当大,所以我将给出“merged_data”的视图:

merged_data

GemData <- read_dta(("C:/Users/I/Documents//GEM Dataset.dta"))

GlobeData <- read_excel("GLOBE-Phase-2-Aggregated-Societal-Culture-Data.xls")

> dput(head(reference_iso))
structure(list(name = c("Afghanistan", "Aland Islands", "Albania", 
"Algeria", "American Samoa", "Andorra"), alpha.3 = c("AFG", "ALA", 
"ALB", "DZA", "ASM", "AND")), row.names = c(NA, 6L), class = "data.frame")
> merged_data <- GlobeData %>% 
+   left_join(reference_iso, by = c('Country Name' = 'name')) %>% 
+   rename(iso3 = 'alpha.3') %>% 
+   left_join(GemData, by = c('iso3' = 'cntry') )
> model1 <- lm(all_high_stat_entre ~ Uncertainty Avoidance Societal Practices ,data=merged_data)
Error: unexpected symbol in "model1 <- lm(all_high_stat_entre ~ Uncertainty Avoidance"

对于这种错误出现有什么建议吗?

如前所述,您的“大变量名称”不能在公式中临时引用。虽然我不知道这是否正确(数据图片不包含足够的上下文),但我怀疑您需要做的就是用反引号括起所有 space-包括变量,如

model1 <- lm(all_high_stat_entre ~ `Uncertainty Avoidance Societal Practices`,
             data=merged_data)

示范:

mt <- mtcars
names(mt)[2] <- "c yl"
head(mt, 3)
#      mpg  c yl  disp    hp  drat    wt  qsec    vs    am  gear  carb
#    <num> <num> <num> <num> <num> <num> <num> <num> <num> <num> <num>
# 1:  21.0     6   160   110  3.90 2.620 16.46     0     1     4     4
# 2:  21.0     6   160   110  3.90 2.875 17.02     0     1     4     4
# 3:  22.8     4   108    93  3.85 2.320 18.61     1     1     4     1

lm(mpg ~ c yl + disp, data = mtcars)
# Error: unexpected symbol in "lm(mpg ~ c yl"
# x

lm(mpg ~ `c yl` + disp, data = mt)
# Call:
# lm(formula = mpg ~ `c yl` + disp, data = mt)
# Coefficients:
# (Intercept)       `c yl`         disp  
#    34.66099     -1.58728     -0.02058  

为什么?

从语言解析的角度考虑这一点:作为文字数字、变量或函数的“标记”必须由某些东西分隔。在大多数情况下,这需要是中缀运算符、括号或逗号。

示例:

  • c(1 2) 不起作用,因为我们希望 12 不同,所以我们使用逗号。

  • mean 2 应该是 mean(2),括号将它们分开。我们可以选择在此处包含 spaces,mean (2)mean( 2) 工作得很好,因此 spaces 这里 将被忽略。

  • 如果我们有两个变量xy,那么我们可以做x + yx+y,其中中缀+ clearly/obviously将它们分开。

不过,一般来说,R 中没有多少东西(有吗?)是完全 space 分隔的。 1 2var1 var2等类似的都是解析错误。如果我们有一个带有 space 的变量(或者不符合 https://cran.r-project.org/doc/FAQ/R-FAQ.html#What-are-valid-names_003f),那么我们必须通知 R 如何包含 spaces,这通常是用反引号完成的.

`a b` <- 1
a b
# Error: unexpected symbol in "a b"
# x
`a b`
# [1] 1

在某些地方,我们可以使用引号,但反引号也可以。

zz <- setNames(list(11, 12), c("a b", "c d"))
zz$`a b`
# [1] 11
zz$"c d"
# [1] 12
zz[["c d"]]
# [1] 12
zz[[`c d`]]
# Error: object 'c d' not found

请注意反引号并不总是合适的:在某些位置,它们会推动 R 查找具有该名称的对象。如果我们在这里做 zz[[`a b`]],它就不会出错,但那是因为在前面的代码块中我创建了一个名为 `a b` 的变量,这就是它会找到的,然后将其解析为 zz[[1]](因此 11)。

回到你的案例,你的变量名中有 spaces。对于许多基础 R(和一些包)数据读取函数,它们往往具有 check.names= 或类似用途的参数,将 a b 的名称转换为 a.b,但是 readxl::read_excel 而不是 这样做,所以它允许 space。虽然我对哪个是完美的选择意见不一,但我认为将 space 包含在变量名中对新用户来说是一种风险。我确实喜欢 read_excel returns a tibble,并且 tibbles 的呈现往往包括(如果没有其他的话,为了视觉参考)围绕非法名称的反引号。例如,

readxl::read_excel("Book2.xlsx")
# # A tibble: 1 x 3
#   `a b` `c d`    ef
#   <dbl> <dbl> <dbl>
# 1    11    22    33

这是一个清晰的视觉提示,前两个变量名称需要反引号括起来。