我如何从data.frame中提取以行名命名的向量

问题描述 投票:0回答:1

我有一个带有一些有意义的行名的data.frame。我想从中提取一列作为向量,并且此向量应继承行名,以便它是命名的向量。该向量应被馈入一个函数,该函数需要一个命名的向量作为输入。我想轻按一下使用此向量,因此在第二步中附加名称并不能真正起作用。

示例代码:

my_function <- function(x){
  print(names(x[x>mean(x)]))
}

test.frame <- data.frame(nr=1:10, factor=rep(c("A", "B"), 5))
rownames(test.frame) <- letters[1:10]

tapply(test.frame$nr, test.frame$factor, my_function)

在这种情况下,my_function应用于两个未命名的矢量1:5和6:10。我想要的是,该函数取而代之的是从附加的行名中仍然具有字母[1:5]和字母[6:10]的向量。

我可以实现此目的的一种方法是更改​​函数,以便它期望使用一个2列data.frame而不是一个命名矢量,其中第一列为名称,第二列为数字,但看起来很笨拙。所以也许有更好的方法?

r dataframe
1个回答
0
投票

不完全确定预期的输出,但是这是一种表示它的方式。我们可以将行名放在一列中,并将其显示为每个factor的逗号分隔值,并为mean列添加factornr

library(dplyr)

test.frame %>%
  tibble::rownames_to_column() %>%
  group_by(factor) %>%
  summarise(rownames = toString(rowname), 
             nr = mean(nr))

#  factor rownames         nr
#  <fct>  <chr>         <dbl>
#1 A      a, c, e, g, i     5
#2 B      b, d, f, h, j     6

0
投票

如果将命名向量存储在数据框中,它将丢失其names属性。

x <- 1:5
names(x) <- letters[1:5]
x
#> a b c d e 
#> 1 2 3 4 5
attributes(x)
#> $`names`
#> [1] "a" "b" "c" "d" "e"
df <- data.frame(x = x)
attributes(df$x)
#> NULL

但是,如果将数据框转换为列表,则可以保留命名的向量,并且仍然使用$选择列。

可以像这样将数据帧转换为以行命名的向量列表:

with_names <- function(df) 
{
  lapply(as.list(df), function(x) {names(x) <- row.names(df); return(x)})
}

所以现在有了

df <- with_names(df)
df
#> $`x`
#> a b c d e 
#> 1 2 3 4 5 
attributes(df$x)
#> $`names`
#> [1] "a" "b" "c" "d" "e"
© www.soinside.com 2019 - 2024. All rights reserved.