簡體   English   中英

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

[英]how do I extract a vector named with the rownames from a data.frame

我有一個帶有一些有意義的行名的 data.frame。 我想從中提取一列作為向量,這個向量應該繼承行名,以便它是一個命名向量。 這個向量應該被輸入到一個期望命名向量作為輸入的函數中。 我想在 tapply 中使用這個向量,所以在第二步中附加名稱並沒有真正起作用。

示例代碼:

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 而不是命名向量,第一列是名稱,第二列是數字,但這似乎很笨拙。 那么也許有更好的方法?

您可以使用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"

如果我理解正確,您想從數據框中提取命名向量,其中向量的名稱取自數據框的行名稱。

問題是,通常如果您將命名向量存儲在數據框中,它會丟失其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

但是,如果您使用函數I()指定命名向量應“按原樣”保留,則它不會丟失它的names屬性:

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"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM