dplyr中与add_rownames相反的函数是什么?

13
作为一个中间步骤,我生成了一个包含一个字符串列和其余为数字的数据框。我想将其转换为矩阵,但首先我必须将该字符列转换为行名并从数据框中删除它。
在dplyr中有没有简单的方法可以做到这一点?是否有一个类似于add_rownames()相反的函数to_rownames()
我看到一个solution使用自定义函数,但它真的不符合dplyr的理念。

我认为dplyr的理念并不包括非data.frame对象。它目前的标语是“针对数据框的专业plyr”。https://github.com/hadley/dplyr - Frank
@Frank,将数据框转换为矩阵并不一定需要使用该函数。如果我只需要根据现有字段更改行名称呢?或者干脆不使用dplyr哲学中的行名称呢? - yuk
2
嗯,我不知道。我的对这个包的了解不超过标语:) 你可以在这里看到hadley反对rownames: https://github.com/hadley/tibble/blob/master/R/rownames.R 哦,看起来确实有一个column_to_rownames函数。 - Frank
3个回答

19

你现在可以使用tibble包:

tibble::column_to_rownames()

你是最棒的! - Tommaso Guerrini

7
这提供了NSE和标准评估函数:
library(dplyr)

df <- data_frame(a=sample(letters, 4), b=c(1:4), c=c(5:8))

reset_rownames <- function(df, col="rowname") {
  stopifnot(is.data.frame(df))
  col <- as.character(substitute(col))
  reset_rownames_(df, col)
}

reset_rownames_ <- function(df, col="rowname") {
  stopifnot(is.data.frame(df))
  nm <- data.frame(df)[, col]
  df <- df[, !(colnames(df) %in% col)]
  rownames(df) <- nm
  df
}

m <- "rowname"

head(as.matrix(reset_rownames(add_rownames(mtcars), "rowname")))
##                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
## Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

head(as.matrix(reset_rownames_(add_rownames(mtcars), m)))
##                    mpg cyl disp  hp drat    wt  qsec vs am gear carb
## Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
## Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
## Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
## Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
## Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
## Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

也许使用 to_rownames()set_rownames() 更加合适。 ¯\_(ツ)_/¯ 个人见解可能不同。

这是一个很酷的函数。学到了很多关于使用 NSE 的知识。谢谢!如果 @hadley 能够评论这个函数是否可以被包含进 dplyr 中,那就太好了。 - yuk
这在tibbles上已经不再起作用了。它会抛出“在tibble上设置行名称已被弃用”的错误。 - Rentrop
这并不意味着它不起作用。这只是一个弃用警告。 - hrbrmstr

1
如果你真的需要一个矩阵,你可以将字符列保存到一个单独的变量中,然后删除它,再创建矩阵。
library(dplyr)

df <- data_frame(a = sample(letters, 4), b = c(1:4), c = c(5:8))

letters <- df %>% select(a)
a.matrix <- df %>% select(-a) %>% as.matrix

不确定您在那之后要做什么,但这可以帮助您达到您所要求的程度...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接