![](/img/trans.png)
[英]How do I extract a single column from a data.frame as a 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.