当我试图运行我的回归模型时,我面临以下问题:
这两个数据集非常大,所以我将给出"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"
对于这个错误的出现有什么建议吗?
如前所述,您的"大变量名称"不能在公式中特别引用。虽然我不知道这是否正确(pic数据没有包含足够的上下文),但我怀疑您所需要做的就是将所有包含空格的变量用反引号括起来,如
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
为什么?
从语言解析的角度来考虑这个问题:"tokens"它们是文字数字、变量或函数,必须用某些东西来分隔。在大多数情况下,这需要使用中缀操作符、父括号或逗号。
例子:
c(1 2)
不起作用,因为我们希望1
和2
不同,所以我们使用逗号。mean 2
应为mean(2)
,其中父字符将它们分开。我们可以选择在这里包括空格,mean (2)
和mean( 2)
工作很好,所以空格在这里被忽略。如果我们有两个变量
x
和y
,那么我们可以做x + y
或x+y
,其中中缀+
清楚/明显地将它们分开。
一般来说,R中没有多少东西(任何?)是完全用空格分隔的。1 2
,var1 var2
和类似的是解析错误。如果我们有一个有空格的变量(或者不符合https://cran.r-project.org/doc/FAQ/R-FAQ.html#What-are-valid-names_003f),那么我们必须通知R如何包含空格,这通常是用反引号完成的。
`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
)。
回到你的例子,你的变量名中有空格。对于许多基本R(和一些包)数据读取函数,它们倾向于使用check.names=
或类似目的的参数,将名称a b
转换为a.b
,但readxl::read_excel
不不这样做,因此它允许空格。虽然我对哪个是完美的选择有不同的看法,但我认为在变量名中包含空格对新用户来说是一种风险。我确实喜欢read_excel
返回tibble
,并且标题的表示倾向于在不合法的名称周围包含(如果没有别的的话,为了视觉参考)反引号。例如,
readxl::read_excel("Book2.xlsx")
# # A tibble: 1 x 3
# `a b` `c d` ef
# <dbl> <dbl> <dbl>
# 1 11 22 33
,这是一个清晰的视觉提示,前两个变量名需要反勾框。