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

时间:2020-01-29 09:06:08

标签: r dataframe

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

示例代码:

number

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

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

2 个答案:

答案 0 :(得分:2)

您可以使用setNames获取命名向量:

tapply(setNames(test.frame$nr, rownames(test.frame))
     , test.frame$factor, my_function)
#[1] "g" "i"
#[1] "h" "j"
#$A
#[1] "g" "i"
#
#$B
#[1] "h" "j"

答案 1 :(得分: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

但是,如果您指定使用功能names“按原样”保留命名向量,则它不会丢失其I()属性:

df <- data.frame(x = I(x))
attributes(df$x)
#> $`names`
#> [1] "a" "b" "c" "d" "e"
#> 
#> $class
#> [1] "AsIs"

这意味着,如果要将数据框中的所有列都命名为向量,则需要使用以下函数将它们全部标记为这样:

with_names <- function(df) 
{
  as.data.frame(lapply(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 

因此您的行名可用于从df提取的任何向量中:

tapply(df$x, c(1, 2, 1, 2, 1), names)
#> $`1`
#> [1] "a" "c" "e"
#> 
#> $`2`
#> [1] "b" "d"
相关问题