我正在努力解决这个愚蠢的问题,我似乎找不到解决方案
我有一个数据框,我需要获取字符串形式的列名称。
例如出
df$month
我想要“月”。我需要将其自动化,以便它可以推广到
data$variable
和输出
"variable"
适用于任何数据框和变量名称。
提前感谢这位救星
由于
data$var
返回一个值向量,这里有一个 dplyr
解决方案:
library(dplyr)
data %>%
select(variable) %>%
colnames()
一个例子:
iris %>%
select(Species) %>%
colnames()
输出:
[1] "Species"
您问的问题很好,但答案比应有的要复杂得多。 在 R 中从数据名称到字符串的转换是一个困难的过程,通常最好避免。但是,如果您真的需要以字符串形式获取数据帧列的名称,则此函数将完成这项工作:
columnName <- function(ColumnReference) {
return(substring(deparse(substitute(ColumnReference)),which(strsplit(deparse(substitute(ColumnReference)),"")[[1]]=="$")[1]+1))
}
例如:
columnName(df$month)
退货:
"month"
从
"variable"
得到data$variable
,过程是完全一样的:
columnName(data$variable)
deparse(substitute(ColumnReference))
返回您在括号中输入的任何内容作为字符串。因此,如果 ColumnReference == df$variable
,这部分代码将返回 "df$variable"
。当然,我们只想要字符串的最后一部分,即 "$"
之后的部分。因此,为了获取字符串的一部分,我们使用 substring(string, first)
函数。 substring 函数中的第二个参数确定从字符串中开始剪切子字符串的位置。在我们的例子中,这将是 "$"
字符的索引,再加一,以便 "$"
字符不包含在我们的子字符串中。可以使用代码 x
获取字符 y
在字符串 which(strsplit(y, "")[[1]] == x)
中出现的位置列表。由于我们只查找 "$"
的一次出现,因此我们会将 [1]
添加到该代码的末尾。所以这个函数总的来说是这样的:
return(
substring(
text = input as string,
first = index of "$" in (input as string)
+ 1
)
)
这是该功能的组织布局:
columnName <- function(ColumnReference) {
return(
substring(
text = deparse(substitute(ColumnReference)),
first = which(strsplit(deparse(substitute(ColumnReference)),"")[[1]]=="$")[1] + 1
)
)
}
我希望这有帮助!