dplyr:使用 rename_ 重命名变量
dplyr: Renaming variables with rename_
我正在尝试重命名链中的几个变量:
df_foo = data_frame(
a.a = 1:10,
"b...b" = 1:10,
"cc..d" = 1:10
)
df_foo %>%
rename_(
.dots = setNames(
names(.),
gsub("[[:punct:]]", "", names(.)))
)
这工作正常,但是当其中一个变量的名称中有 space 时:
df_foo = data_frame(
a.a = 1:10,
"b...b" = 1:10,
"c c..d" = 1:10
)
df_foo %>%
rename_(
.dots = setNames(
names(.),
gsub("[[:punct:]]", "", names(.)))
)
我收到此错误:
Error in parse(text = x) : <text>:1:3: unexpected symbol
1: c c..d
^
我不确定这是从哪里来的,因为我 运行 gsub
直接:
setNames(
names(df_foo),
gsub("[[:punct:]]", "", names(df_foo)))
我没有收到错误。不确定这里发生了什么。
这现在在 dplyr
GH 问题页面上作为 issue #2391 提出。
总的来说:我强烈建议您不要使用带空格的变量名。它们很痛苦,而且往往会造成比其价值更多的麻烦。
这里是这个错误的原因。
rename_
派遣到 dplyr:::rename_.data.frame
。该函数的第一行是:
dots <- lazyeval::all_dots(.dots, ...)
然后 lazyeval
函数将调用 lazyeval::as.lazy_dots
,后者使用 lazyeval::as.lazy
,后者本身使用 lazyeval:::as.lazy.character
,后者调用 lazy_(parse(text = x)[[1]], env)
。现在,parse()
期望有效的 R 表达式作为其文本参数:
text: character vector. The text to parse. Elements are treated as if they were lines of a file. (from help("parse")
)
这就是为什么 rename_
似乎不喜欢带空格的字符向量,我们得到 "Error in parse(text = x)
":
lazyeval:::as.lazy(names(df_foo)[2])
<lazy>
expr: b...b
env: <environment: base>
lazyeval:::as.lazy(names(df_foo)[3])
Error in parse(text = x) : <text>:1:3: unexpected symbol
1: c c..d
^
除了使用 base 进行简单的重命名之外,我不知道其他解决方案。
我正在尝试重命名链中的几个变量:
df_foo = data_frame(
a.a = 1:10,
"b...b" = 1:10,
"cc..d" = 1:10
)
df_foo %>%
rename_(
.dots = setNames(
names(.),
gsub("[[:punct:]]", "", names(.)))
)
这工作正常,但是当其中一个变量的名称中有 space 时:
df_foo = data_frame(
a.a = 1:10,
"b...b" = 1:10,
"c c..d" = 1:10
)
df_foo %>%
rename_(
.dots = setNames(
names(.),
gsub("[[:punct:]]", "", names(.)))
)
我收到此错误:
Error in parse(text = x) : <text>:1:3: unexpected symbol
1: c c..d
^
我不确定这是从哪里来的,因为我 运行 gsub
直接:
setNames(
names(df_foo),
gsub("[[:punct:]]", "", names(df_foo)))
我没有收到错误。不确定这里发生了什么。
这现在在 dplyr
GH 问题页面上作为 issue #2391 提出。
总的来说:我强烈建议您不要使用带空格的变量名。它们很痛苦,而且往往会造成比其价值更多的麻烦。
这里是这个错误的原因。
rename_
派遣到 dplyr:::rename_.data.frame
。该函数的第一行是:
dots <- lazyeval::all_dots(.dots, ...)
然后 lazyeval
函数将调用 lazyeval::as.lazy_dots
,后者使用 lazyeval::as.lazy
,后者本身使用 lazyeval:::as.lazy.character
,后者调用 lazy_(parse(text = x)[[1]], env)
。现在,parse()
期望有效的 R 表达式作为其文本参数:
text: character vector. The text to parse. Elements are treated as if they were lines of a file. (from
help("parse")
)
这就是为什么 rename_
似乎不喜欢带空格的字符向量,我们得到 "Error in parse(text = x)
":
lazyeval:::as.lazy(names(df_foo)[2])
<lazy> expr: b...b env: <environment: base>
lazyeval:::as.lazy(names(df_foo)[3])
Error in parse(text = x) : <text>:1:3: unexpected symbol 1: c c..d ^
除了使用 base 进行简单的重命名之外,我不知道其他解决方案。