r语言 - 如何解决数据集变量的问题



当我试图运行我的回归模型时,我面临以下问题:

这两个数据集非常大,所以我将给出"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)不起作用,因为我们希望12不同,所以我们使用逗号。

  • mean 2应为mean(2),其中父字符将它们分开。我们可以选择在这里包括空格,mean (2)mean( 2)工作很好,所以空格在这里被忽略。

  • 如果我们有两个变量xy,那么我们可以做x + yx+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

,这是一个清晰的视觉提示,前两个变量名需要反勾框。

最新更新