与dplyr中的add_rownames相反的功能

时间:2016-04-18 21:02:53

标签: r matrix dataframe dplyr

作为中间步骤,我生成一个数据框,其中一列作为字符串,其余为数字。我想将其转换为矩阵,但首先我必须将该字符列转换为行名并将其从数据框中删除。

dplyr中有没有简单的方法呢?类似to_rownames()的函数与add_rownames()相反?

我看到solution使用自定义函数,但它完全脱离了dplyr哲学。

3 个答案:

答案 0 :(得分:16)

You can now use the tibble-package:

tibble::column_to_rownames()

答案 1 :(得分: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()更有意义。 ¯\_(ツ)_/¯ YMMV。

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

不确定在那之后你会做什么,但这可以让你达到你所要求的......