【问题标题】:How to get the name of variable using it's index in R如何使用它在R中的索引来获取变量的名称
【发布时间】:2022-01-09 04:40:06
【问题描述】:

我的数据看起来像这样

Name      A    B    C    D    E
r1        1    5    12  21    15
r2        2    4     7  10     9
r3        5   15     6   9     6
r4        7    8     0   7    18

我的问题是如何使用它的索引来获取变量的名称

例如,如果我想要索引号 1 的名称,则返回的名称是“A”

谢谢

【问题讨论】:

  • 不清楚索引是什么意思。是列索引吗?然后, 1 应该将 'Name' 作为列,因为列索引是 1

标签: r dataframe


【解决方案1】:

我想你想知道哪个(名称)包含值1

tmp <- colSums(dat == 1) > 0
names(tmp[tmp])
# [1] "A"

演练:

  1. == 返回一个包含每个位置匹配的矩阵:

    dat == 1
    #       Name     A     B     C     D     E
    # [1,] FALSE  TRUE FALSE FALSE FALSE FALSE
    # [2,] FALSE FALSE FALSE FALSE FALSE FALSE
    # [3,] FALSE FALSE FALSE FALSE FALSE FALSE
    # [4,] FALSE FALSE FALSE FALSE FALSE FALSE
    
  2. colSums(.) &gt; 0 告诉我们哪一列至少有一个TRUE

    colSums(dat == 1) > 0
    #  Name     A     B     C     D     E 
    # FALSE  TRUE FALSE FALSE FALSE FALSE 
    
  3. ... 然后我们取找到的名字的名字。如果没有找到,它将返回一个空向量:

    names(tmp[tmp])
    # character(0)
    

我能想到的唯一问题是,如果您正在进行高精度浮点比较,在这种情况下 IEEE-754 就会发挥作用(请参阅 Why are these numbers not equal?Is floating point math broken?https://en.wikipedia.org/wiki/IEEE_754)。为此,请考虑对不等式进行容忍测试,而不是严格的平等测试。

这要求我们只查看数字列。

isnum <- sapply(dat, is.numeric)
isnum
#  Name     A     B     C     D     E 
# FALSE  TRUE  TRUE  TRUE  TRUE  TRUE 

tmp <- colSums(abs(dat[,isnum] - 1) < 1e-5) > 0
#                      ,^^^^^  ^^^^^^^^^^^.
#   subset the data --'                   
# ... and a test of inequality within tolerance
names(tmp[tmp])
# [1] "A"

【讨论】:

  • JQQ:sapply的目的是什么? dat == 1 不能工作吗?不过很好奇
  • 是的,当然你是对的,它正在进入不同的兔子洞并且没有撤消它。谢谢!
【解决方案2】:

使用colnames() 函数然后索引产生的向量。

colnames(mtcars)[1] 

这将返回mtcars 中第一个变量的名称。只需更改 data.frame 的名称以匹配您的名称,并将数字更改为感兴趣的变量。例如iris 中的第三个变量是

 colnames(iris)[3]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多