我有一个带有一些有意义的行名的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而不是一个命名矢量,其中第一列为名称,第二列为数字,但看起来很笨拙。所以也许有更好的方法?
不完全确定预期的输出,但是这是一种表示它的方式。我们可以将行名放在一列中,并将其显示为每个factor
的逗号分隔值,并为mean
列添加factor
的nr
。
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
如果将命名向量存储在数据框中,它将丢失其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"