【问题标题】:R: Using data frame column names as vector namesR:使用数据框列名称作为向量名称
【发布时间】:2023-03-31 19:25:01
【问题描述】:

我是一个相当新的 R 用户(MATLAB 转换),我正在尝试使用我为数据集提供的列名来命名我的数据集中的变量。

假设我有一个名为 Z 的数据框,其中包含三列,如下所示。

Header <- c("Date", "Time", "Data")
colnames(Z) <- Header

有没有一种简单的方法可以将这些列名转换为向量名,这样当我在命令行中键入“数据”时,第 3 列的值就会出现(这样我就可以在脚本中轻松调用这些名称)?

非常感谢!

【问题讨论】:

  • 不确定我是否理解...你想要attach?如attach(Z); Data。但我强烈建议不要这样做。
  • 我已经命名了我的数据框的列...现在我要做的是使用与实际数据列对应的向量名称相同的列名。
  • 再说一次,我不理解也不建议这样做,但是:sapply(names(z), function(x) assign(x, z[[x]], envir=.GlobalEnv))。执行此操作的“R”方式只是在data.frame:x &lt;- 'Data'; Z[[x]] 中访问它们。

标签: r


【解决方案1】:

以下是使用数据附加和分离函数的示例。我相信这对于交互式使用来说是可以的,但这不是编程的最佳实践。可能,它根本不推荐使用,我相信我从未使用过它!

Z <- data.frame(matrix(rpois(9, 80), ncol = 3, nrow = 9))
head(Z)
> head(Z)
X1  X2  X3
1  69  69  69
2  80  80  80
3  69  69  69
4 103 103 103
5  65  65  65
6  81  81  81

# Use different names for each column!

Header <- c("Date_1", "Time", "Data_2")
colnames(Z) <- Header

head(Z)
 Date_1 Time Data_2
1   69   69   69
2   80   80   80
3   69   69   69
4  103  103  103
5   65   65   65
6   81   81   81


attach(Z)

Date_1
[1]  69  80  69 103  65  81  84  70  93

Time
[1]  69  80  69 103  65  81  84  70  93

detach(Z)

# Do not forget to detach! 
Time
Error: objeto 'Time' no encontrado

也许另一个选项正在使用:

with(Z, Time)
# [1] 91 81 81 87 82 72 81 74 85

with(Z, quantile(Time))
#  0%  25%  50%  75% 100% 
#  72   81   81   85   91 

或者只是对每个变量进行子集化。

# Subsetting keeping attributes
Z[2]
Z["Time"]

attributes(Z["Time"])
# $names
# [1] "Time"

# $class
# [1] "data.frame"

# $row.names
# [1] 1 2 3 4 5 6 7 8 9

# Subsetting droping attributes
Z$Time
Z[["Time"]]

attributes(Z[["Time"]])
# NULL

【讨论】:

    【解决方案2】:

    通常使用“$”运算符访问数据框中的列。在你的情况下,你想使用

    Z$Data
    

    获取“数据”向量。 R 有一个名为“attach()”的函数,它本质上将一个数据帧指定为您的参考帧,以便您在命令行中输入的任何与数据帧中的列标题匹配的变量都将返回该向量,ala

    attach(Z)
    Data
    

    将返回“数据”向量。但是,不建议这样做,因为跟踪附加的框架并不总是那么容易,并且可能会产生意想不到的后果。如果您想为独立于数据框但名称与列名称相同的每列创建单独的数据向量,您可以这样做:

    Header <- c("Date", "Time", "Data")
    for (i in 1:length(Header)){
      assign(Header[i], Z[ ,i])
      }
    

    虽然我再次使用“$”符号运算符来访问数据框中的列。比拥有两个名称相似的数据副本要好。

    【讨论】:

    • 感谢大家的回复!我想我会使用 '$' 运算符...这是一个庞大的数据集,没有必要拥有两个数据副本。
    • 如果这对您有用,请考虑接受答案。这样,问题就不会像未回答那样突然出现了。谢谢。
    • SO 的约定是等待一天后再接受答案。否则你几乎可以保证没有其他人会看到它。
    【解决方案3】:

    您可以使用$ 运算符按名称调用列,也可以按列在数据框中的位置调用列,在您的示例中:

    z$Data
    

    z[3]
    

    z[,3]
    

    都是一样的。

    查看此参考卡:http://cran.r-project.org/doc/contrib/Short-refcard.pdf。当我刚开始使用 R 时,我无法告诉你它帮助了我多少次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-03
      • 2017-04-19
      • 2019-04-06
      相关资源
      最近更新 更多